Как получить записи с сайтов в Multisite?
Я пытаюсь получить записи с нескольких сайтов. Например, я могу получить записи с одного сайта по категории, всего 10 записей.
Но я пытаюсь получить записи с двух отдельных блогов Multisite 1 и 2. Однако работает только блог 1. Также я хочу получить записи из другой категории с блога 1 и блога 2. Как это можно реализовать?
Вот что я пытаюсь сделать:
<?php
global $switched;
switch_to_blog(1,2); // переключение на блоги 1 и 2, но работает только 1
// Получаем последние записи
$latest_posts = get_posts('&cat=64&showposts=10');
$cnt = 0;?>
<ul>
<?php foreach($latest_posts as $post) : setup_postdata($post);?>
<li>
<a href="<?php echo get_page_link($post->ID); ?>" title="<?php echo $post->post_title; ?>"><?php echo short_title('...', 7); ?></a>
</li>
<?php endforeach ; ?>
<?php restore_current_blog(); // возвращаемся на главный сайт ?>

Функция WordPress switch_to_blog()
ожидает целое число в качестве входного параметра. Подробнее об этом можно прочитать в Codex:
http://codex.wordpress.org/Function_Reference/switch_to_blog
Попробуйте использовать следующую структуру:
// Получаем ID текущего блога
$original_blog_id = get_current_blog_id();
// Массив ID блогов для перебора
$bids = array( 1, 2 );
foreach( $bids as $bid )
{
// Переключаемся на блог с ID $bid
switch_to_blog( $bid );
// ... ваш код для каждого блога ...
}
// Возвращаемся к текущему блогу
switch_to_blog( $original_blog_id );
Обновление:
Если вам нужно получать записи из разных категорий для каждого блога, можно использовать, например:
// Получаем текущий блог
$original_blog_id = get_current_blog_id();
// Настраиваем слаг категории для каждого ID блога, который нужно перебрать - ИЗМЕНИТЕ
$catslug_per_blog_id = array(
1 => 'video',
4 => 'news'
);
foreach( $catslug_per_blog_id as $bid => $catslug )
{
// Переключаемся на блог с ID $bid
switch_to_blog( $bid );
// ... ваш код для каждого блога ...
$myposts = get_posts(
array(
'category_name' => $catslug,
'posts_per_page' => 10,
)
);
// ... и т.д.
}
// Возвращаемся к текущему блогу
switch_to_blog( $original_blog_id );
Пример:
Вот пример, позволяющий использовать теги шаблонов (работает в моей мультисайтовой установке):
// Получаем текущий блог
$original_blog_id = get_current_blog_id();
// Настраиваем категорию для каждого ID блога, который нужно перебрать - ИЗМЕНИТЕ
$catslug_per_blog_id = array(
1 => 'video',
4 => 'news'
);
foreach( $catslug_per_blog_id as $bid => $catslug )
{
// Переключаемся на блог с ID $bid
switch_to_blog( $bid );
// Получаем записи для каждого блога
$myposts = get_posts(
array(
'category_name' => $catslug,
'posts_per_page' => 2,
)
);
// Пропускаем блог, если записи не найдены
if( empty( $myposts ) )
continue;
// Цикл для каждого блога
$li = '';
global $post;
foreach( $myposts as $post )
{
setup_postdata( $post );
$li .= the_title(
$before = sprintf( '<li><a href="%s">', esc_url( get_permalink() ) ),
$after = '</a></li>',
$echo = false
);
}
// Выводим для каждого блога
printf(
'<h2>%s (%s)</h2><ul>%s</ul>',
esc_html( get_bloginfo( 'name' ) ),
esc_html( $catslug ),
$li
);
}
// Возвращаемся к текущему блогу
switch_to_blog( $original_blog_id );
wp_reset_postdata();
Демонстрационный скриншот для нашего примера, где сайт 1 называется Beethoven, а сайт 4 — Bach:
PS: Спасибо @brasofilo за ссылку, которая прояснила мое недопонимание работы restore_current_blog()
;-)
PPS: Спасибо @ChristineCooper за следующий комментарий:
Дружеское предупреждение. Убедитесь, что не сохраняете ID исходного блога в переменную
$blog_id
— это связано с тем, что в процессе работыswitch_to_blog()
ядро WordPress перезаписывает$blog_id
, и при попытке вернуться к исходному блогу вы окажетесь на последнем переключенном. Небольшая головоломка. :)

вот как я загружаю свои посты http://pastie.org/7827649 как я могу реализовать это здесь, как я упомянул, по идентификаторам блогов, но для каждого идентификатора блога с определенной категорией: блог 1 будет иметь категорию videos, а блог 2 — категорию news, также с общим лимитом в 10 постов.

Проверьте это: restore_current_blog() vs switch_to_blog()

@brasofilo, большое спасибо за ссылку, это меняет мой взгляд на restore_current_blog()
;-)

у меня до сих пор возникает проблема, на оригинальном мультисайтовом блоге отображается только одна запись, вот как я это сделал http://pastie.org/7831263

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

в вашей версии pastie номер 2, ваш код должен быть внутри цикла foreach, где я отметил // ... etc

ps: снова обновил пример, так что вы можете использовать теги шаблонов, такие как the_title()
, вместо $post->post_title
;-) Надеюсь, я дал вам достаточно информации, чтобы вы могли завершить свой проект.

спасибо, я дам вам знать, если это сработает, спасибо за вашу потрясающую помощь :D

ну смотри, проблема в том, что всё отображается гладко, но всё выводится списком, понимаешь, так как я опубликовал в своем pastie — вот так я и хочу, потому что просто добавлять заголовок и всё такое — это немного сложно для меня, я не слишком разбираюсь. Есть ли способ сделать это так же просто, как у меня было? Можно ли оставить это так? http://pastie.org/7896095 извини за беспокойство, надеюсь, ты понимаешь

Замени foreach($rightbox as $post)
на foreach($posts as $post)
в твоем pastie.

Я получаю ошибку Parse error: syntax error, unexpected $end в index.php, поэтому я просто добавил этот код в index.php сам по себе, и получаю эту ошибку. Вот обновленная версия http://pastie.org/7896699

Дружеское предупреждение. Убедитесь, что не устанавливаете исходный ID блога в переменную $blog_id — это потому что во время процесса switch_to_blog() значение $blog_id будет перезаписано основной функцией, что означает, что когда вы попытаетесь вернуться к исходному блогу, вы в итоге переключитесь на последний, через который проходили в цикле. Немного головоломки. :)

спасибо за эту информацию @ChristineCooper. Похоже, я использовал $original_blog_id
здесь, чтобы избежать перезаписи $blog_id
;-)

Надеюсь, вы не против, что я добавил ваш комментарий в обновленный ответ @ChristineCooper

Привет! Хочу спросить, как мне это реализовать, чтобы заработало? Нужно ли поместить этот код в мою тему или в functions.php? Спасибо!

Смотрите мой ответ здесь: https://wordpress.stackexchange.com/questions/307040/wp-rest-api-multisite-get-posts-from-all-sites/307051#307051

Посмотрите код в моем плагине "Multisite Post Reader" https://wordpress.org/plugins/multisite-post-reader/. В нем используется техника из другого ответа для перебора записей. У меня также есть плагины, которые делают то же самое для изображений.
Поскольку это открытый исходный код, вы можете свободно изучать код и использовать его части для своих целей. (Часть кода была модифицирована из найденного мной открытого исходного кода.)
