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

8

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

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

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

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

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

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

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

NetConstructor.com
источник

Ответы:

7

Я знаю, что вы сказали, что не хотите устанавливать плагин, но это именно то, что вы хотите сделать в этой ситуации. Размещение кода в 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 сайтов, ожидайте появления проблем с производительностью.

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

EAMann
источник
Спасибо за ваш ответ. Мне нравится ваша идея сделать это через пользовательский SQL-запрос, так как я предполагаю, что это создаст меньшую нагрузку. Я надеюсь, что вы сможете показать мне, какие плагины вы бы использовали для создания этих подсетей, с которыми могут быть связаны сайты, и, надеюсь, когда у вас будет время, запрос sql будет использоваться для автоматического запроса всех сообщений в этим сайтам назначена подсеть. Я очень ценю ваше время
NetConstructor.com
3
Если возможно, пожалуйста, обновите
NetConstructor.com
1

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

Основой является то, что он сначала получает список всех идентификаторов блогов в вашей сети. Затем он создает большой одиночный запрос (используя UNION для объединения всех строк и не требующий уродливых соединений), который получает результат, содержащий столбцы 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

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

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

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

andrea_r
источник
на какие платные вы ссылаетесь?
NetConstructor.com
1
бесплатно: wordpress.org/extend/plugins/wp-multi-network
andrea_r
1
и заплатил: (мое) wpebooks.com/networks
andrea_r
-3

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

встроить его на свой сайт

Мирей Раад
источник
@mirelle - но это явно не тот ответ, который я искал
NetConstructor.com