Вопрос или проблема
Следующий код выводит все сообщения из сети.
Чего я пытаюсь достичь:
- Выбрать, какие блоги отображать (по ID)
- Выбрать, сколько сообщений отображать (мой код выбирает количество сообщений на каждый блог)
-
Сортировка по дате или случайным образом
$blogs = get_last_updated(); foreach ($blogs AS $blog) { switch_to_blog($blog["blog_id"]); $lastposts = get_posts('numberposts=3'); foreach($lastposts as $post) : ?> <a href="https://wordpress.stackexchange.com/questions/257024/<?php echo get_permalink(); ?>"><?php the_title(); ?></a></h3> <?php endforeach; restore_current_blog(); }
Я создал плагин, который делает что-то похожее (называется Multisite Post Display https://wordpress.org/plugins/multisite-post-reader/). Он отображает сообщения со всех подсайтов мультисайтовой сети.
Код из него может быть полезен для того, что вы делаете. Вы можете изучить его и использовать в своем проекте. (В конце концов, я использовал фрагменты чужого кода для разработки его.)
Я написал его после того, как сделал Multisite Media Display, так как хотел способ отображать медиафайлы с подсайтов на одной странице, но не смог найти ни одного плагина, который бы это делал. Оба они были полезны для мониторинга опубликованных медиафайлов и контента из моей мультисайтовой сети.
Бесплатно, с открытым исходным кодом и все такое. Надеюсь, это полезно.
Ответа Рика, несомненно, полезен, но я хотел бы поделиться своим подходом, который является адаптацией или расширением вашего кода:
Сначала получите список выбранных блогов в вашей сети.:
$args = array('site__in' => array(2, 3, 6))
$sitesObj = get_sites($args);
$sites = object_to_array($sitesObj);
Вы также можете исключить сайты, используя 'site__not_in'
в аргументах get_sites()
.
Преобразуйте объект $sitesObj
в массив:
$sites = object_to_array($sitesObj);
object_to_array($object) {
if (!is_object($object) && !is_array($object)) {
return $object;
}
return array_map('object_to_array', (array) $object) ;
}
Затем инициализируйте счетчик для контроля общего числа отображаемых сообщений и переключайтесь на каждый выбранный блог, чтобы запустить цикл с вашими пользовательскими аргументами:
$postCounter = 0;
$maxPosts = 5; // общее количество сообщений для отображения
foreach ($sites as $site) {
switch_to_blog($site['blog_id']);
$args = array(
'post_type' => 'post', // или другой тип записи
'posts_per_page' => 2, // количество сообщений на блог
'order' => 'DESC',
'orderby' => 'date' // также можно использовать 'rand'
);
$loop = new WP_Query($args);
if ($loop->have_posts()) :
while ($loop->have_posts() && $counter < $maxPosts) : $loop->the_post();
// ваш вывод
endwhile;
endif;
restore_current_blog();
}
Надеюсь, это поможет 🙂
Это
function wolpostcount_shortcode($atts) {
function object_to_array($object) {
if (!is_object($object) && !is_array($object)) {
return $object;
}
return array_map('object_to_array', (array) $object) ;
}
$args = array('site__in' => array(1,7,8,12,14,15,20,21,22,25,32,33,36,41,42,46,47,48,49));
$sitesObj = get_sites($args);
$sites = object_to_array($sitesObj);
foreach ($sites as $site) {
switch_to_blog($site['blog_id']);
$postcount = wp_count_posts('post')->publish;
$pagecount = wp_count_posts('page')->publish;
echo 'Posts:'.$postcount.' Pages:'.$pagecount.'<br>';
$totalpostcount = $totalpostcount + $postcount;
$totalpagecount = $totalpagecount + $pagecount;
restore_current_blog();
}
echo 'number of posts '.$totalpostcount.'<br>';
echo 'number of pages '.$totalpagecount.'<br>';
function get_all_networks_posts($args){
if(!$args){
return false;
}
$sites = get_sites();
$blog_posts = array();
if($sites){
foreach ($sites as $site) {
switch_to_blog($site->id);
$posts = get_posts($args);
$blog_posts[$site->id] = $posts; // это вышестоящая строка
//$blog_posts[] = $posts; Если вам не нужны ID сайтов, используйте эту строку, удалив вышестоящую
}
}
restore_current_blog();
if($blog_posts){
return $blog_posts;
}
}
// Печать демонстрации
$args = arrat(
'post_type' => 'post',
'posts_per_page' => -1,
);
print_r(get_all_networks_posts($args));
Некоторое время назад я написал небольшой внутренний плагин, чтобы показывать сообщения с главного сайта (где находится блог) на подсайте в сети. Также я хотел показывать только сообщения из определенной категории на определенном подсайте.
function custom_multiblog ( $atts ) {
// Получить текущий блог
$original_blog_id = get_current_blog_id();
// Настроить категорию для каждого ID блога, который хотите просканировать – ИЗМЕНИТЬ
if ( 19 == $original_blog_id ) {
$catslug_per_blog_id = array( 1 => 'category1', );
} else if ( 22 == $original_blog_id ) {
$catslug_per_blog_id = array( 1 => 'category2', );
} else if ( 23 == $original_blog_id ) {
$catslug_per_blog_id = array( 1 => 'category3', );
} else {
$catslug_per_blog_id = array( 1 => 'category1, category2, category3', );
}
foreach( $catslug_per_blog_id as $bid => $catslug ) {
//Переключиться на блог с ID $bid
switch_to_blog( $bid );
$args = array(
//'post_type' => 'post',
'category_name' => $catslug,
'posts_per_page' => 10,
);
$args['paged'] = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
echo '<div class="multiblog-wrapper">';
$query = new WP_Query( $args );
while( $query->have_posts() ) : $query->the_post();
echo '<article class="multiblog-item">';
echo '<div class="multiblog-img"><a href="' .get_the_permalink() . '">';
the_post_thumbnail ('large');
echo '</a></div>';
echo '<div class="multiblog-content">';
echo '<h2 style="line-height: 1em;"><a href="' .get_the_permalink() . '">' . get_the_title() . '</a></h2>';
echo '<p>' . get_the_excerpt() . '</p>';
echo '</div>';
echo '<div class="clearfix"></div>';
echo '</article>';
endwhile;
echo '</div>';
}
switch_to_blog( $original_blog_id );
wp_reset_postdata();
echo '<div class="clearfix"></div>';
echo '<div class="multiblog-navigation">';
previous_posts_link( '<< новее' );
next_posts_link( 'старее >>', $query->max_num_pages );
echo '</div>';
}
add_shortcode( 'multiblog', 'jetzt_konf_multiblog' );
Ответы выглядят достаточно устаревшими, поэтому позвольте мне предложить свое решение. Я рекомендую вам использовать класс Network_Query, который схож с WP_Query, но работает на всех блогах в мультисайтовой сети.
Шаг за шагом.
Выберите, какие блоги отображать (по ID)
Для этого нужно всего лишь предоставить параметр blog__in
в классе Network_Query.
$args = array(
'blog_id' => array( 2, 3, 4 ) // только из блогов 2, 3 и 4
);
$network_query = new Network_Query( $args );
Выберите, сколько сообщений отображать (мой код выбирает количество сообщений на каждый блог)
Для достижения этого мы просто используем свойство found_posts
.
$network_query = new Network_Query( $args );
echo $network_query->found_posts;
Сортировка по дате или случайным образом
И наконец, мы используем параметр orderby
:
$args = array(
'orderby' => 'rand', // 'date' используется по умолчанию
);
$network_query = new Network_Query( $args );
Это практически все. Чтобы класс Network_Query был доступен в вашей мультисайтовой сети, вам нужно установить этот плагин: https://rudrastyh.com/plugins/get-posts-from-all-blogs-in-multisite-network
.
Ответ или решение
Для эффективного отображения постов из нескольких сайтов в сети WordPress Multisite, необходимо решить несколько ключевых задач. Вопрос касается извлечения и управления постами, распределёнными по различным подсайтам в сети. Рассмотрим, как можно достичь этого, задавшись следующими требованиями: выборка определённых блогов по их идентификаторам, отображение заданного числа постов и сортировка постов по дате либо случайным образом.
Теория
-
Выбор блогов по ID: В WordPress Multisite каждая отдельная блоговая ячейка имеет свой уникальный идентификатор. Чтобы динамически управлять тем, с каких блогов извлекаются данные, необходимо использовать функцию
get_sites()
, которая позволяет выбирать только те блоги, которые вам нужны, с помощью параметраsite__in
. -
Управление числом отображаемых постов: Каждый раз, когда у нас есть задача выбрать ограниченное число постов, необходимо использовать аргумент
posts_per_page
вWP_Query
илиget_posts()
. Этот аргумент определяет, сколько именно постов будет извлечено. -
Сортировка записей: Сортировка может быть выполнена на основании различных критериев, ключевыми из которых являются
date
для сортировки по дате иrand
для случайной выборки.
Пример реализации
Для начала следует получить список нужных блогов. Пример кода, который может быть использован для выборки блогов с определёнными ID, следующий:
$args = array('site__in' => array(2, 3, 6)); // массив идентификаторов блогов
$sitesObj = get_sites($args); // получение блогов
$sites = object_to_array($sitesObj); // преобразование объекта в массив
В данном примере функция object_to_array
упрощает манипуляции с данными, переводя объект в удобный для работы массив.
Следующий шаг – это создание цикла, который будет переключаться на каждый из выбранных блогов, извлекая посты согласно заданным условиям. Пример кода:
$postCounter = 0;
$maxPosts = 5; // максимальное число постов для вывода
foreach ($sites as $site) {
switch_to_blog($site['blog_id']); // переключение между блогами
$args = array(
'post_type' => 'post', // тип постов
'posts_per_page' => 2, // сколько постов с каждого блога
'order' => 'DESC',
'orderby' => 'date' // можно использовать 'rand' для случайной выборки
);
$loop = new WP_Query($args);
if ($loop->have_posts()) :
while ($loop->have_posts() && $postCounter < $maxPosts) : $loop->the_post();
echo '<a href="' . get_permalink() . '">' . get_the_title() . '</a><br>';
$postCounter++;
endwhile;
endif;
restore_current_blog(); // возврат к оригинальному блогу
}
Применение
Данный подход предоставляет гибкость в управлении данными, размещёнными на мультисайтах. Он особенно актуален для корпоративных порталов или сетей сайтов, где администратор хочет иметь контроль над содержимым, видимым пользователям. Например, если сеть WordPress используется для образовательных учреждений, администраторы могут демонстрировать новости из тех кампусов или факультетов, которые имеют наибольшее значение для текущих задач.
В реальных сценариях, ключевую роль играют оптимизация времени выполнения запросов и корректное переключение между контекстами сайтов, что важно для поддержания производительности и целостности данных.
Заключение: внедрение такого функционала требует уверенности в работе с WordPress функциями для мультисайтов и понимания внутренних процессов, таких как кэширование и обработка данных. Использование Network_Query, как упомянуто в более продвинутых решениях, может упростить задачу, но также требует дополнительной установки плагинов для поддержки через мультисайтовые сети.