web-dev-qa-db-fra.com

Recevoir des messages de sites dans Multisite?

J'essaie de tirer plusieurs posts de sites. Par exemple, je peux extraire un seul site de messages par catégorie et un total de 10 messages.

Mais j'essaie d'extraire les deux articles de deux blogs multisites distincts, 1 et 2. Mais seul le blog 1 fonctionne. De plus, je souhaite extraire une autre catégorie du blog 1 et du blog 2 par une autre catégorie. Comment puis-je atteindre cet objectif?

Voici ce que j'essaie de faire:

<?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 ?>
16
DeadArtcore

La fonction WordPress switch_to_blog() attend un entier comme paramètre d'entrée. Vous pouvez en savoir plus à ce sujet dans le Codex:

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

S'il vous plaît essayez ce genre de structure à la place:

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

Mettre à jour:

Si vous souhaitez récupérer des publications de différentes catégories pour chaque blog, vous pouvez utiliser par exemple:

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

Exemple:

Voici un exemple qui vous permet d'utiliser des balises de modèle (cela fonctionne sur l'installation multisite):

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

Voici une capture d'écran de démonstration de notre exemple ci-dessus avec le site 1 nommé Beethoven et le site 4 nommé Bach :

 demo 

PS: Merci à @brasofilo qui a fourni le lien qui clarifie mon incompréhension de la restore_current_blog() ;-)

PPS: Merci à @ChristineCooper pour le commentaire suivant:

Juste un avertissement amical. Assurez-vous de ne pas définir l'id de votre blog d'origine sur la variable $blog_id. En effet, lors du processus switch_to_blog(), $blog_id sera remplacé par la fonction principale, ce qui signifie que lorsque vous tenterez de revenir au blog d'origine, vous basculerez jusqu'au dernier que vous avez parcouru. Un petit peu un casse-tête. :)

11
birgire

Regardez le code dans mon plugin "Multisite Post Reader" https://wordpress.org/plugins/multisite-post-reader/ . Il utilise la technique de l'autre réponse pour parcourir les messages. J'ai aussi des plugins qui font la même chose pour les images.

Puisqu'il s'agit d'un code à source ouverte, vous pouvez vous y promener et en utiliser des morceaux pour votre propre usage. (Une partie du code est modifiée à partir du code open-source que j'ai trouvé.)

0
Rick Hellewell