Как получить записи с сайтов в Multisite?

10 мая 2013 г., 06:25:46
Просмотры: 38.4K
Голосов: 20

Я пытаюсь получить записи с нескольких сайтов. Например, я могу получить записи с одного сайта по категории, всего 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(); // возвращаемся на главный сайт ?>
0
Все ответы на вопрос 2
23
15

Функция 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:

Демонстрация работы switch_to_blog() в WordPress

PS: Спасибо @brasofilo за ссылку, которая прояснила мое недопонимание работы restore_current_blog() ;-)

PPS: Спасибо @ChristineCooper за следующий комментарий:

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

10 мая 2013 г. 11:24:37
Комментарии

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

DeadArtcore DeadArtcore
10 мая 2013 г. 20:20:32

Я обновил ответ, чтобы поддерживать разные категории.

birgire birgire
10 мая 2013 г. 21:39:59

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

brasofilo brasofilo
10 мая 2013 г. 23:22:31

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

birgire birgire
11 мая 2013 г. 00:17:19

Стивен Харрис сделал то же самое для меня :)

brasofilo brasofilo
11 мая 2013 г. 02:03:36

Постараюсь передать это своим коллегам-пользователям WordPress ;-)

birgire birgire
11 мая 2013 г. 12:10:41

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

DeadArtcore DeadArtcore
11 мая 2013 г. 18:57:00

нужна помощь, кто-нибудь?..

DeadArtcore DeadArtcore
11 мая 2013 г. 20:26:26

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

birgire birgire
11 мая 2013 г. 21:46:06

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

birgire birgire
11 мая 2013 г. 21:54:25

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

birgire birgire
11 мая 2013 г. 22:08:19

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

DeadArtcore DeadArtcore
11 мая 2013 г. 22:09:59

ок, отлично, удачи ;-)

birgire birgire
11 мая 2013 г. 22:11:57

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

DeadArtcore DeadArtcore
11 мая 2013 г. 22:32:26

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

birgire birgire
12 мая 2013 г. 01:27:14

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

DeadArtcore DeadArtcore
12 мая 2013 г. 02:13:55

Кто-нибудь может помочь мне решить это?..

DeadArtcore DeadArtcore
12 мая 2013 г. 08:36:41

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

Christine Cooper Christine Cooper
2 апр. 2016 г. 18:37:30

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

birgire birgire
2 апр. 2016 г. 20:25:48

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

birgire birgire
3 апр. 2016 г. 01:48:47

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

Jornes Jornes
26 апр. 2020 г. 10:27:32

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

birgire birgire
26 апр. 2020 г. 11:33:07

Спасибо! Я посмотрю. У меня есть еще одна проблема, которая пока не решена, так как ответа не было. Не могли бы вы помочь с этим? Мне очень нужно решение. Спасибо!

Jornes Jornes
26 апр. 2020 г. 13:22:53
Показать остальные 18 комментариев
0

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

Поскольку это открытый исходный код, вы можете свободно изучать код и использовать его части для своих целей. (Часть кода была модифицирована из найденного мной открытого исходного кода.)

15 сент. 2018 г. 20:30:50