Получать сообщения с сайтов в мультисайте?

17

Я пытаюсь вытащить несколько сайтов сообщений. Например, я могу вытащить один пост на сайте по категории и всего постов 10.

Но я пытаюсь извлечь оба поста из двух отдельных мультисайтовых блогов 1 и 2. Но работает только блог 1. Кроме того, я хочу извлечь другую категорию из блога 1 и блога 2 другой категорией. Как мне этого добиться?

Вот что я пытаюсь сделать:

<?php
global $switched;
switch_to_blog(1,2); //switched to 1 & 2 but only 1 working

// Get latest Post
$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(); //switched back to main site ?>
DeadArtcore
источник

Ответы:

12

Функция WordPress switch_to_blog()ожидает целое число в качестве входного параметра. Вы можете прочитать больше об этом в Кодексе:

http://codex.wordpress.org/Function_Reference/switch_to_blog

Пожалуйста, попробуйте такую ​​структуру:

// Get the current blog id
$original_blog_id = get_current_blog_id(); 

// All the blog_id's to loop through
$bids = array( 1, 2 ); 

foreach( $bids as $bid )
{
    // Switch to the blog with the blog_id $bid
    switch_to_blog( $bid ); 

    // ... your code for each blog ...
}

// Switch back to the current blog
switch_to_blog( $original_blog_id ); 

Обновить:

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

// Get current blog
$original_blog_id = get_current_blog_id(); 

// Setup a category slug for each blog id, you want to loop through - EDIT
$catslug_per_blog_id = array( 
    1 => 'video',
    4 => 'news' 
); 

foreach( $catslug_per_blog_id as $bid => $catslug )
{
    // Switch to the blog with the blog id $bid
    switch_to_blog( $bid ); 

    // ... your code for each blog ...
    $myposts = get_posts( 
        array( 
            'category_name'  => $catslug,
            'posts_per_page' => 10, 
        )
    );
    // ... etc
}

// Switch back to the current blog
switch_to_blog( $original_blog_id ); 

Пример:

Вот пример, который позволяет вам использовать теги шаблонов (это работает на моей многоузловой установке):

// Get current blog
$original_blog_id = get_current_blog_id();

// Setup a category for each blog id you want to loop through - EDIT
$catslug_per_blog_id = array( 
    1 => 'video',
    4 => 'news' 
); 

foreach( $catslug_per_blog_id as $bid => $catslug )
{
    //Switch to the blog with the blog id $bid
    switch_to_blog( $bid ); 

    // Get posts for each blog
    $myposts = get_posts( 
        array( 
            'category_name'  => $catslug,
            'posts_per_page' => 2, 
        )
    );

    // Skip a blog if no posts are found
    if( empty( $myposts ) )
        continue;

    // Loop for each blog
    $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
        );
    }

    // Print for each blog
    printf(
        '<h2>%s (%s)</h2><ul>%s</ul>',
        esc_html( get_bloginfo( 'name' ) ),
        esc_html( $catslug ),
        $li  
    );
}

// Switch back to the current blog
switch_to_blog( $original_blog_id ); 

wp_reset_postdata();

Вот демонстрационный скриншот для нашего примера с сайтом 1 по имени Бетховен и сайтом 4 по имени Бах :

демонстрация

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

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

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

birgire
источник
вот как я загружаю свои сообщения pastie.org/7827649, как я могу реализовать это в этом, также как я упоминаю оба идентификатора блога, но каждый идентификатор блога по определенной категории блог 1 будет иметь видео категории, а блог 2 будет иметь также новости категории всего постов 10 лимитов.
DeadArtcore
1
Я обновил ответ для поддержки разных категорий.
Birgire
1
ps: обновил пример еще раз, так что вы можете использовать теги шаблонов как the_title()вместо $post->post_title;-) Я надеюсь, что дал вам достаточно информации, чтобы вы могли закончить свой проект.
Биргире
1
Заменить foreach($rightbox as $post)с foreach($posts as $post)вашей Pastie.
Биргире
1
Надеюсь, это нормально, что я добавил ваш комментарий к обновленному ответу @ChristineCooper
birgire
0

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

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

Рик Хеллуэлл
источник