Múltiples bucles WP_Query con Paginación

29 mar 2012, 17:14:37
Vistas: 19.7K
Votos: 12

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

Puedo crear un único bucle personalizado con paginación usando 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, // mostrar 2 posts
    'paged' => $paged
);
$wp_query->query($args);
while ($wp_query->have_posts()) : $wp_query->the_post();

// El 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, lo que significa que cuando haces clic en "Página 2" te lleva a la Página 2 para AMBOS bucles.

¿Hay alguna manera de separar estos bucles entre sí para que cada uno tenga su propia paginación independiente?

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

1
Comentarios

mira esta publicación donde he resuelto el problema de paginación de múltiples bucles para mí http://wordpress.stackexchange.com/questions/126814/wordpress-static-page-pagination/139594#139594

ewroman ewroman
29 mar 2014 12:29:28
Todas las respuestas a la pregunta 1
12
20

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

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

            // Bucle personalizado con Paginación 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>

    <!-- Perros -->
    <div class="animals">
        <?
            // Bucle personalizado con Paginación 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>
29 mar 2012 17:32:02
Comentarios

Muchas gracias por responder, Boone. Entiendo lo que dices, pero cada vez que intento cambiar el get_query_var, me lanza un error.

Aquí está el código actualizado: http://paste.pocoo.org/show/573208/

El error:

Call to a member function get() on a non-object in C:\wamp\www\wordpress_wp_query_pagination\wp-includes\query.php on line 27
Cory Cory
29 mar 2012 19:21:52

Dos cosas: 1) Estás haciendo cosas raras con el global $wp_query. (2) Hay algunas peculiaridades de implementación en WP_Query que hacen imposible usar get_query_var() y algunas otras funciones con él, así que generalmente accedo directamente al superglobal $_GET, asegurándome de sanitizar haciendo cast a int. He actualizado mi respuesta con un ejemplo completo funcional.

Boone Gorges Boone Gorges
29 mar 2012 20:55:14

¡Increíble Boone! Muchas gracias, funciona perfectamente. Hora de estudiarlo a fondo.

Las cosas raras con WP_Query venían de este artículo del 2008: http://weblogtoolscollection.com/archives/2008/04/19/paging-and-custom-wordpress-loops/

Pensé que quizás get_query_var estaba obteniendo la misma variable, pero no tuve la mente para obtenerla directamente con $_GET.

De nuevo, muchas gracias. Llevo peleando con esto una eternidad.

Cory Cory
30 mar 2012 00:10:37

Genial. ¡Buena suerte!

Boone Gorges Boone Gorges
30 mar 2012 00:17:52

Ah, rayos. ¿Te animas a seguir luchando conmigo en esto? :)

Después de probar tu versión, noté que no regresa a la página 1. Se queda atascada en la página 2.

Además, cuando haces clic en una página diferente, reinicia el otro bucle. ¿Es posible encadenar estas variables $_GET para que recuerde http://foo.com/?paged_1=2&paged_2=3?

Cory Cory
30 mar 2012 00:31:18

No estoy seguro de lo que quieres decir con "se queda atascada". En cuanto al otro punto - sí, eso es a lo que me refería con la última frase de mi respuesta. Tendrás que concatenar los parámetros 'base' o 'format' para que sean conscientes del otro argumento de paginación.

Boone Gorges Boone Gorges
30 mar 2012 00:35:40

Este es el error que estoy obteniendo: http://www.screenr.com/tmS8 Aquí está mi código (el mismo error ocurre con tu código textual): http://paste.pocoo.org/show/573351/

Cory Cory
30 mar 2012 00:48:53

OK, he cambiado la respuesta nuevamente.

Boone Gorges Boone Gorges
30 mar 2012 01:50:41

Parece funcionar perfectamente. ¡Muchísimas gracias Boone! Eres un genio de la Ivy League. :D

Por curiosidad, ¿cómo funciona exactamente ese parámetro 'add_args'? Miré en el Codex pero no es muy específico.

Cory Cory
30 mar 2012 02:46:57

add_args te permite agregar un array de argumentos a la URL. Está más claro en la documentación en línea y en la función misma: https://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/general-template.php#L1876 https://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/general-template.php#L1985

Boone Gorges Boone Gorges
30 mar 2012 02:52:17

¿puedes echar un vistazo a esta pregunta? http://stackoverflow.com/questions/23841520/pagination-error-wordpress

Nisham Mahsin Nisham Mahsin
24 may 2014 09:12:52

Sé que esto es antiguo pero me funciona. Pregunta, ¿cómo haría las reglas de reescritura para esto?

Digitalchild Digitalchild
27 sept 2015 13:21:37
Mostrar los 7 comentarios restantes