Запрашивать сообщения с нескольких сайтов в сети?


Я понимаю, что было несколько вопросов, которые вращаются вокруг решения, которое я ищу, но я считаю, что ищу что-то конкретное.

На самом деле это вопрос из двух частей:

1) Моя цель состоит в том, чтобы wordpress работал в сетевом (мультисайтовом) режиме, и я пытаюсь найти способ по существу "сгруппировать" конкретные сайты вместе. Я знаю о плагине "Мультисеть", но я сомневаюсь, что это лучший подход для этого? Ключ здесь в том, чтобы позволить конкретные пользователи для добавления/редактирования сайтов в своей собственной подсети.

2) Это ключевой вопрос этого поста... Я хотел бы знать наилучший подход, который позволил бы мне по существу запрашивать сообщения из этой "подсети" сайтов. Так, например, если в этой подсети есть 10 сайтов, и каждый из них создал сообщения в пользовательском типе сообщений под названием "новости", то я хотел бы иметь возможность отображать, например, 10 самых последних опубликованных сообщений из этой коллекции 10 сайтов.

ПРИМЕЧАНИЕ: Мне нужна возможность создавать множество подсетей, что, в свою очередь, означает, что запрос последних опубликованных "новостей" может отображать только сообщения от тех, кто принадлежит к правильной группе.

Наконец - я понимаю, что существуют решения для подобных вещей, но я ищу наилучший подход в обоих случаях, который требует НАИМЕНЬШЕГО объема загрузки/запросов базы данных. Я также очень хотел бы сделать это с помощью кода в моем functions.php файл вместо установки плагинов, которые создают дополнительное раздувание.

Я очень открыт для любых предложений и ценю любой ответ.

Author: nobody, 2010-10-04

4 answers

Я знаю, вы сказали, что предпочли бы не устанавливать плагин, но это именно то, что вы хотите сделать в этой ситуации. Размещение кода в файле functions.php вашей темы требует, чтобы вы либо использовали одну и ту же тему на всех сайтах в подсети, либо сохраняли несколько копий одного и того же файла. С другой стороны, вы можете создать простой подключаемый модуль для сети, чтобы инкапсулировать функциональность, затем активировать его в сети и сразу же получить функциональность, доступную только с один файл для ведения. Это фактически создаст меньше раздувания, чем в зависимости от ваших functions.php файлов.

Здесь следует иметь в виду, что вам либо придется просмотреть каждый сайт в сети, чтобы найти свои публикации, либо выполнить пользовательский запрос. Я бы выбрал вторую процедуру, потому что, хотя она немного сложнее, это один запрос, а не отдельный запрос для каждого блога.

В принципе... вам нужно будет сделать следующее:

  1. Получите список всех идентификаторов блогов в сети/подсети. Если используется ванильная установка, это можно найти в wp_blogs стол. Просто выполните простой запрос SELECT, чтобы загрузить массив, затем вы можете выполнить цикл, чтобы добавить каждый блог в свой основной запрос.
  2. Создайте цикл, который добавляет каждый блог в большой запрос. Вам нужно будет JOIN объединить таблицы и выполнить поиск на основе blog_id (из wp_blogs), post_id ( из wp_BLOG_posts), и обычай таксономия.

Как я уже сказал, это не простое решение (оператор SQL будет очень сложно, и у меня сейчас нет времени, чтобы взломать его), но это будет единственное утверждение, которое сделает всю работу.

Альтернативно...

  1. Получите список идентификаторов блога и сохраните его в массиве.
  2. Повторите свой массив, запрашивая каждый блог в сети и добавляя свои совпадения (сообщения с определенным термином таксономии) в отдельный массив.

С помощью альтернативного метода вам придется запускать отдельный запрос для каждого блога в сети. Если ваша сеть состоит из 10-20 сайтов, это не слишком большая проблема. Если ваша сеть насчитывает 200-500 сайтов, ожидайте, что начнут возникать некоторые проблемы с производительностью.

Кроме того, вы должны кэшировать результаты вашего запроса, если это вообще возможно. Если он запускается при загрузке нескольких страниц (т. Е. Для виджета боковой панели, доступного по сети), то вам нужно только выполнить запрос когда нужно будет получить новые данные. В противном случае, предоставьте кэшированные результаты, чтобы не замедлять работу сети.

 7
Author: EAMann, 2010-10-05 14:20:32

У меня была похожая проблема. Мне нужно было получить список сообщений на всех сайтах сети, отсортированных по комментариям (чтобы показать самые популярные сообщения). Это функция, которую я использовал.

Основа заключается в том, что сначала он получает список всех идентификаторов блогов в вашей сети. Затем он строит большой единый запрос (используя ОБЪЕДИНЕНИЕ для объединения всех строк и не требующий уродливых соединений), который получает результат, содержащий столбцы blog_id, ID и comment_count. Используя это, я затем использую get_blog_post(), чтобы получить каждый из сообщений подробная информация.

Есть несколько строк отладки, которые вы можете использовать в разных точках, чтобы увидеть, что происходит.

function txx_top_posts_mu( $howMany = 10 ) {
global $wpdb;
global $table_prefix;

// get an array of the table names that our posts will be in
// we do this by first getting all of our blog ids and then forming the name of the 
// table and putting it into an array
$rows = $wpdb->get_results( "SELECT blog_id from $wpdb->blogs WHERE
    public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0';" );
if ( $rows ) :
    $blogPostTableNames = array();
    foreach ( $rows as $row ) :
        $blogPostTableNames[$row->blog_id] = $wpdb->get_blog_prefix( $row->blog_id ) . 'posts';
    endforeach;
    //print_r($blogPostTableNames);

    // now we need to do a query to get all the posts from all our blogs
    // ordered by the number of comments and with limits applied
    if ( count( $blogPostTableNames ) > 0 ) :
        $query = '';
        $i = 0;
        foreach ( $blogPostTableNames as $blogId => $tableName ) :
            if ( $i > 0 ) :
                $query.= ' UNION ';
            endif;
            $query.= " SELECT ID, comment_count, $blogId as `blog_id` FROM $tableName ";
            $i++;
        endforeach;
        $query.= " ORDER BY comment_count DESC LIMIT 0,$howMany;";
        //echo $query;
        $rows = $wpdb->get_results( $query );

        // now we need to get each of our posts into an array and return them
        if ( $rows ) :
            $posts = array();
            foreach ( $rows as $row ) :
                $posts[] = get_blog_post( $row->blog_id, $row->ID );
            endforeach;
            //print_r($posts);
            return $posts;
        endif;
    endif;
endif;
return false;

}

 1
Author: , 2011-03-15 20:11:27

Вам определенно нужны многоузловые сетевые плагины. В настоящее время есть три варианта на выбор: два платных, один бесплатный.

Оттуда вы можете использовать что-то вроде плагина тегов по всему сайту, чтобы отправлять сообщения в основной блог в каждой сети.

Ни одно из этих действий не может быть (или не должно быть) выполнено из файла функций темы.

 -1
Author: andrea_r, 2010-10-26 00:31:15

Создайте собственную поисковую систему Google google.com/cse укажите все сайты, которые вы хотите найти

Добавьте его на свой сайт

 -3
Author: mireille raad, 2010-10-05 11:24:22