netconstructorcom
  • 0
Мастер

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

  • 0

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

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

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

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

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

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

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

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

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

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

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

    }

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

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

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

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

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

    • 0

Оставить ответ

You must login to add an answer.