Otrzymywać posty z witryn w Multisite?

17

Próbuję pobrać wiele postów z witryn. Na przykład mogę wyciągnąć pojedyncze posty z witryny według kategorii i łącznej liczby postów 10.

Ale próbuję wyciągnąć oba posty z dwóch oddzielnych blogów Multisite 1 i 2. Ale działa tylko blog 1. Chcę też wyciągnąć inną kategorię z bloga 1 i bloga 2 według innej kategorii. Jak mogę to osiągnąć?

Oto, co próbuję zrobić:

<?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
źródło

Odpowiedzi:

12

Funkcja WordPress switch_to_blog()oczekuje liczby całkowitej jako parametru wejściowego. Możesz przeczytać więcej na ten temat w Kodeksie:

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

Spróbuj zamiast tego tego rodzaju struktury:

// 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 ); 

Aktualizacja:

Jeśli chcesz pobrać posty z różnych kategorii dla każdego bloga, możesz użyć na przykład:

// 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 ); 

Przykład:

Oto przykład, który pozwala na użycie tagów szablonów (działa to w mojej instalacji na wielu serwerach):

// 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();

Oto zrzut ekranu demonstracyjny dla powyższego przykładu z witryną 1 o nazwie Beethoven i witryną 4 o nazwie Bach :

próbny

PS: Dzięki @brasofilo udostępniając link który wyjaśnia moje nieporozumienie restore_current_blog();-)

PPS: Podziękowania dla @ChristineCooper za udostępnienie następującego komentarza:

Tylko przyjazne ostrzeżenie. Pamiętaj, aby nie ustawiać oryginalnego identyfikatora bloga na zmienną $blog_id- dzieje się tak, ponieważ w trakcie switch_to_blog() procesu $blog_idzostanie zastąpiona przez podstawową funkcję, co oznacza, że ​​gdy spróbujesz wrócić do oryginalnego bloga, przejdziesz do ostatniego jeden, przez który przeszedłeś. Trochę układanki umysłu. :)

birgire
źródło
oto jak ładuję moje posty pastie.org/7827649 jak mogę to zaimplementować, tak jak wspomniałem o obu identyfikatorach blogów, ale każdy identyfikator blogu według konkretnej kategorii blog 1 będzie zawierał kategorie filmów, a blog 2 będzie zawierał wiadomości kategorii łączna liczba postów to 10 limit.
DeadArtcore
1
Zaktualizowałem odpowiedź, aby obsługiwać różne kategorie.
birgire,
1
ps: zaktualizowałem przykład ponownie, abyś mógł używać tagów szablonów takich jak the_title()zamiast $post->post_title;-) Mam nadzieję, że podałem ci wystarczająco dużo informacji, abyś mógł dokończyć swój projekt.
birgire,
1
Wymień foreach($rightbox as $post)się foreach($posts as $post)w Pastie.
birgire
1
Mam nadzieję, że jest ok, że dodałem twój komentarz do zaktualizowanej odpowiedzi @ChristineCooper
birgire
0

Spójrz na kod w mojej wtyczce „Multisite Post Reader” https://wordpress.org/plugins/multisite-post-reader/ . Wykorzystuje technikę z drugiej odpowiedzi, aby przeglądać posty. Mam również wtyczki, które robią to samo dla obrazów.

Ponieważ jest to kod typu open source, możesz wędrować po nim i używać jego fragmentów na własny użytek. (Część kodu została zmodyfikowana w stosunku do kodu open source, który znalazłem.)

Rick Hellewell
źródło