web-dev-qa-db-fra.com

Comment utiliser des boucles imbriquées de types de publication personnalisés pour des blogs MultiSite à l'aide de WP_Query ()

J'utilise le code de 'WordPress Query Multisite' de miguelpeixe afin de créer une boucle personnalisée pour les _ 'sites enfants' de mon WP Multi-site. Dans cette boucle, je veux imbriquer une autre boucle qui extraira des types de publication personnalisés de ce site enfant, comme:

Site 1
    CPT 1
    CPT 2
Site 2
    CPT 3
    CPT 4

Je suis réellement capable de faire fonctionner la boucle et capable de tirer les types de post personnalisé enfant. Cependant, la boucle répète un site enfant. Je ne suis pas sûr si je manque juste un bogue évident ou quoi, voici le code que j'utilise:

<?php
    $args_outer = array(
        'multisite' => 1,
        'sites__not_in' => array(1),
    );
    $child_site_query = new WP_Query( $args_outer );
    while($child_site_query->have_posts()) : $child_site_query->the_post(); global $blog_id; // START: Outer Loop
    // --------------------------------------------------
        switch_to_blog($blog_id);

        $args_inner = array(
            'post_type' => 'my_cpt'
        );

        $child_cpts_query = new WP_Query( $args_inner );
        while($child_cpts_query->have_posts()) : $child_cpts_query->the_post(); // START: Inner Loop

        // Variables
        $child_cpt_id =  get_the_ID ();
        $child_cpt_thumbnail = get_post_meta( $child_cpt_id, '_thumbnail_id', true );
        $child_cpt_permalink = get_the_permalink();
        ?>
        <!-- START: HTML -->
        <div class="col-md-3">
            <h3>
                <a href="<?php echo($child_cpt_permalink);?>">
                    <?php echo $blog_id; ?><br>
                    <?php echo $child_cpt_id; ?> - 
                    <?php echo get_the_title(); ?>
                </a>
            </h3>
        </div>
        <!-- END: HTML -->
        <?php
        endwhile;  // END: Inner Loop
        wp_reset_postdata();
        restore_current_blog();


    // --------------------------------------------------
    endwhile;  // END: Outer Loop
    wp_reset_postdata();
?>

Est-ce que je me trompe en ce qui concerne wp_reset_postdata () ou restore_current_blog () sur la boucle interne? (Ce qui est mon soupçon).

Merci d'avance pour toute idée!

2
Ryan Dorn

Ce plugin vous donne déjà une liste de publications pour chaque site, mais il ne fait pas exactement ce que vous voulez faire.

Fondamentalement, il vous donne une liste de tous les messages de votre réseau. Ce que vous devez faire ensuite est de les trier par site_id et de créer une sortie pour cela.

Je ne sais pas s'il s'agit de la meilleure version - mais comme WP_Query renvoie un tableau à une dimension, vous avez besoin de quelque chose d'autre pour le grouper et le trier par site_id

$args_outer = array(
    'multisite' => 1,
    'sites__not_in' => array(1),
    'post_type' => 'my_cpt',
    'numberposts' => -1,
    'posts_per_page' => -1
);
$child_site_query = new WP_Query_Multisite( $args_outer );

while($child_site_query->have_posts()) : $child_site_query->the_post();
    global $blog_id, $post;
    $blogs[$blog_id][] = $post; // create array with first parameter blogid, and the posts inside
    // --------------------------------------------------
endwhile;  // END: Outer Loop
wp_reset_postdata();     

// loop through all blogs
foreach( $blogs as $thisblog => $posts ) {
    // switch to this blog and create output
    switch_to_blog( $thisblog );
    echo 'Site ' . $thisblog . '<br /><ul>';
    // loop through all posts on this blog
    foreach( $posts as $thispost ) {
        echo '<li><a href="' . get_permalink( $thispost->ID ) . '">' . $thispost->post_title . '</a></li>';
    }
    echo '</ul>';
}
restore_current_blog();
2
fischi