web-dev-qa-db-fra.com

5 derniers articles en utilisant la boucle switch_to_blog

je suis sûr que je dois faire quelque chose de mal et apprécierais vraiment un peu d'aide.

J'essaie de parcourir tous mes blogs "Multisite" de sous-répertoires à l'aide de switch_to_blog, ci-dessous:

global $wpdb, $blog_id, $post;
    $blogs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM wp_blogs ORDER BY blog_id" ) );
    foreach ($blogs as $blog){

        switch_to_blog($blog->blog_id);
        $globalquery = get_posts('numberposts=5&post_type=any');
        restore_current_blog();

    }
    array_merge($globalquery, $portfolio);

Cela fonctionne (un peu), il passe au blog suivant (id = 2) et récupère les articles, mais ne va pas plus loin et ne récupère pas les articles principaux du blog (id = 1).

Je suis auto proclamé noob php, mais j'apprécie vraiment d'apprendre et je pense que je me débrouille très bien lol

S'il vous plaît si quelqu'un pourrait m'aider?

Cordialement Rory

UPDATEJ'essaie de créer une boucle que je peux transmettre à une requête déjà déclarée:

// create query the portfolio (pass it to $wp_query)
        $portfolio_query = new WP_Query( $portfolio );
3
Rory Rothon

Non, la récupération des messages est correcte, mais vous ne les stockez nulle part. Voici votre code à nouveau, avec une documentation ligne par ligne:

// Set up global variables. Great
global $wpdb, $blog_id, $post;

// Get a list of blogs in your multisite network
$blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );

// Iterate through your list of blogs
foreach ($blog_ids  as $id){

    // Switch to the next blog in the loop.
    // This will start at $id == 1 because of your ORDER BY statement.
    switch_to_blog($id);

    // Get the 5 latest posts for the blog and store them in the $globalquery variable.
    $globalquery = get_posts('numberposts=5&post_type=any');

    // Switch back to the main blog
    restore_current_blog();
}

// Merge the results of $globalquery with a $portfolio array
array_merge($globalquery, $portfolio);

Le truc, c'est que, dans chaque boucle de votre instruction foreach, vous écrasez écrasez le contenu de $globalquery. Il n'y aura jamais qu'un ensemble de messages du dernier blog de votre réseau.

A la place, configurez un conteneur avant votre foreach et fusionnez-y vos résultats $globalquery:

$globalcontainer = array();
foreach ($blog_ids  as $id){

    switch_to_blog( $id );

    $globalquery = get_posts( 'numberposts=5&post_type=any' );

    $globalcontainer = array_merge( $globalcontainer, $globalquery );

    restore_current_blog();
}
2
EAMann

Pour obtenir les identifiants de blog, vous pouvez utiliser:

$blogs = wp_get_sites ();
$blogs_id = array();
foreach ($blogs as $blog) {
    $blogs_id [] = $blog["blog_id"];
}

au lieu de:

global $wpdb, $blog_id, $post;
$blogs = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM wp_blogs ORDER BY blog_id" ) );
1
Ali Basheer