Múltiples bucles WP_Query con paginación

10

Hay algunas otras preguntas sobre esto (y la paginación WP_Query parece ser una gran pregunta para muchas personas), así que estoy tratando de reducir exactamente cómo hacerlo funcionar.

Puedo crear un solo bucle personalizado con paginación de este código:

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

... pero, naturalmente, si copio / pego este bucle, funciona como un clon exacto, es decir, cuando hace clic en "Página 2", lo lleva a la Página 2 para AMBOS bucles.

¿Hay alguna manera de separarlos unos de otros para que cada página se separe?

Aquí está el código completo completo con un bucle duplicado si alguien está interesado en configurar su propia versión local y jugar con ella: http://paste.pocoo.org/show/573108/

Cory
fuente
mira esta publicación que he resuelto el problema de paginación de bucle múltiple para mí wordpress.stackexchange.com/questions/126814/…
ewroman

Respuestas:

18

Sí, se puede hacer. La clave es hacer que el formatparámetro sea diferente para las dos consultas:

    <!-- 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>
Gargantas de Boone
fuente
Muchas gracias por responder a Boone. Veo lo que estás diciendo, pero cada vez que trato de cambiar get_query_var, arroja un error. Aquí está el código actualizado: paste.pocoo.org/show/573208 El error: Llame a una función miembro get () en un no objeto en C: \ wamp \ www \ wordpress_wp_query_pagination \ wp-includes \ query.php en la línea 27
Cory
Dos cosas: 1) Estás haciendo algunas cosas extrañas con lo $wp_queryglobal. (2) Hay algunas rarezas de implementación en WP_Querysí mismas que hacen que sea imposible de usar get_query_var()y algunas otras funciones con él, por lo que generalmente hago referencia al $_GETsuperglobal directamente, asegurándome de desinfectar al enviarlo int. He actualizado mi respuesta con un ejemplo de trabajo completo.
Boone Gargantas
Impresionante Boone! Muchas gracias, funciona muy bien. Es hora de estudiarlo a fondo. Lo extraño de WP_Query fue de este artículo de 2008: weblogtoolscollection.com/archives/2008/04/19/… Supuse que quizás get_query_var estaba obteniendo la misma var, pero no tenía el cerebro para obtenerlo directamente con $ _GET. De nuevo, muchas gracias hombre. He estado luchando con esto para siempre.
Cory
Frio. ¡Buena suerte!
Boone Gorges
Oh, mierda. ¿Te importa seguir luchando esto conmigo? :) Después de probar su versión, noté que no vuelve a la página 1. Se atasca en la página 2. Además, cuando hace clic en una página diferente, restablece el otro bucle. ¿Es posible encadenar estas variables $ _GET juntas para que recuerde foo.com/?paged_1=2&paged_2=3 ?
Cory