Plusieurs boucles WP_Query avec pagination

10

Il y a quelques autres questions à ce sujet (et la pagination WP_Query semble être une énorme question pour beaucoup de gens), donc j'essaie de préciser exactement comment le faire fonctionner.

Je suis capable de créer une seule boucle personnalisée avec pagination ce code:

// http://weblogtoolscollection.com/archives/2008/04/19/paging-and-custom-wordpress-loops/
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$args = array(
    'showposts' => 2,
    'paged' => $paged
);
$wp_query->query($args);
while ($wp_query->have_posts()) : $wp_query->the_post();

// The Post
the_title();
echo '<br>';
the_category(' ');
the_excerpt();
echo '<hr>';

endwhile;
// http://codex.wordpress.org/Function_Reference/paginate_links#Examples
$big = 999999999;
$pag_args = array(
    'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
    'format' => '?paged=%#%',
    'current' => max( 1, get_query_var('paged') ),
    'total' => $wp_query->max_num_pages
);
echo paginate_links($pag_args);
$wp_query = null;
$wp_query = $temp;

... mais naturellement si je copie / colle cette boucle, cela fonctionne comme un clone exact, ce qui signifie que lorsque vous cliquez sur "Page 2", il vous amène à la page 2 pour les DEUX boucles.

Existe-t-il un moyen de les séparer les uns des autres afin que chacun pagine séparément?

Voici le code complet avec boucle en double si quelqu'un est intéressé par la configuration de sa propre version locale et son utilisation: http://paste.pocoo.org/show/573108/

Cory
la source
regardez ce post que j'ai résolu moi-même le problème de la pagination des boucles multiples wordpress.stackexchange.com/questions/126814/…
ewroman

Réponses:

18

Oui, ça peut se faire. La clé est de rendre le formatparamètre différent pour les deux requêtes:

    <!-- Cats -->
    <div class="animals">
        <?
            $paged1 = isset( $_GET['paged1'] ) ? (int) $_GET['paged1'] : 1;
            $paged2 = isset( $_GET['paged2'] ) ? (int) $_GET['paged2'] : 1;

            // Custom Loop with Pagination 1
            // http://codex.wordpress.org/Class_Reference/WP_Query#Usage
            $args1 = array(
                'paged'          => $paged1,
                'posts_per_page' => 2,
            );
            $query1 = new WP_Query( $args1 );

            while ( $query1->have_posts() ) : $query1->the_post();
                the_title();
                echo '<br>';
                the_category(' ');
                the_excerpt();
                echo '<hr>';
            endwhile;

            // http://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters
            $pag_args1 = array(
                'format'  => '?paged1=%#%',
                'current' => $paged1,
                'total'   => $query1->max_num_pages,
                'add_args' => array( 'paged2' => $paged2 )
            );
            echo paginate_links( $pag_args1 );
        ?>
    </div>

    <!-- Dogs -->
    <div class="animals">
        <?
            // Custom Loop with Pagination 2
            $args2 = array(
                'paged'          => $paged2,
                'posts_per_page' => 2,
            );
            $query2 = new WP_Query( $args2 );

            while ( $query2->have_posts() ) : $query2->the_post();
                the_title();
                echo '<br>';
                the_category(' ');
                the_excerpt();
                echo '<hr>';
            endwhile;

            $pag_args2 = array(
                'format'  => '?paged2=%#%',
                'current' => $paged2,
                'total'   => $query2->max_num_pages,
                'add_args' => array( 'paged1' => $paged1 )
            );
            echo paginate_links( $pag_args2 );
        ?>
    </div>
Gorges de Boone
la source
Merci beaucoup d'avoir répondu Boone. Je vois ce que vous dites, mais chaque fois que j'essaye de changer le get_query_var, il jette une erreur. Voici le code mis à jour: paste.pocoo.org/show/573208 L'erreur: appel à une fonction membre get () sur un non-objet dans C: \ wamp \ www \ wordpress_wp_query_pagination \ wp-includes \ query.php sur la ligne 27
Cory
Deux choses: 1) Vous faites des choses étranges avec le $wp_queryglobal. (2) Il y a des bizarreries d'implémentation en WP_Querysoi qui le rendent impossible à utiliser get_query_var()et d'autres fonctions avec, donc je fais généralement référence $_GETdirectement au superglobal, en veillant à désinfecter en le moulant int. J'ai mis à jour ma réponse avec un exemple de travail complet.
Boone Gorges
Super Boone! Merci beaucoup, fonctionne très bien. Il est temps de l'étudier à fond. Le truc bizarre de WP_Query provenait de cet article de 2008: weblogtoolscollection.com/archives/2008/04/19/… J'ai pensé que peut-être get_query_var récupérait le même var, mais je n'avais pas le cerveau pour l'obtenir directement avec $ _GET. Encore une fois, merci beaucoup mec. Je me bats avec ça pour toujours.
Cory
Cool. Bonne chance!
Boone Gorges
Ah merde. Voulez-vous continuer à me battre avec moi? :) Après avoir testé votre version, j'ai remarqué qu'elle ne revient pas à la page 1. Elle est bloquée à la page 2. De plus, lorsque vous cliquez sur une autre page, elle réinitialise l'autre boucle. Est-il possible de chaîner ces variables $ _GET pour qu'elles se souviennent de foo.com/?paged_1=2&paged_2=3 ?
Cory