Múltiples bucles WP_Query con Paginación
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/

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>

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

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.

¡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.

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?

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.

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/

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.

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

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