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

wordpress.stackexchange https://wordpress.stackexchange.com/questions/2534

  •  16-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

}

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

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

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

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

Введите его на свой веб -сайт

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top