Loop multipli WP_Query con Paginazione
Ci sono diverse domande su questo argomento (e la paginazione di WP_Query sembra essere una grande questione per molte persone), quindi sto cercando di capire esattamente come farla funzionare.
Sono in grado di creare un singolo loop personalizzato con paginazione usando questo codice:
// 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();
// Il 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;
...ma naturalmente se copio/incollo questo loop, funziona come un clone esatto, il che significa che quando si fa clic su "Pagina 2" si viene portati alla Pagina 2 per ENTRAMBI i loop.
C'è un modo per separare questi loop l'uno dall'altro in modo che ciascuno abbia una paginazione indipendente?
Ecco il codice completo con il loop duplicato se qualcuno è interessato a configurare la propria versione locale e sperimentare: http://paste.pocoo.org/show/573108/

Sì, può essere fatto. La chiave è rendere il parametro format
diverso per le due query:
<!-- Gatti -->
<div class="animals">
<?
$paged1 = isset( $_GET['paged1'] ) ? (int) $_GET['paged1'] : 1;
$paged2 = isset( $_GET['paged2'] ) ? (int) $_GET['paged2'] : 1;
// Loop personalizzato con paginazione 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>
<!-- Cani -->
<div class="animals">
<?
// Loop personalizzato con paginazione 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>

Grazie mille per la risposta Boone. Capisco quello che dici, ma ogni volta che provo a modificare il get_query_var, mi restituisce un errore.
Ecco il codice aggiornato: http://paste.pocoo.org/show/573208/
L'errore:
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

Due cose: 1) Stai facendo delle operazioni strane con il globale $wp_query
. (2) Ci sono alcune stranezze nell'implementazione di WP_Query
stessa che rendono impossibile usare get_query_var()
e altre funzioni con esso, quindi generalmente faccio riferimento direttamente al superglobale $_GET
, assicurandomi di sanitizzarlo castando a int
. Ho aggiornato la mia risposta con un esempio completo funzionante.

Fantastico Boone! Grazie mille, funziona alla perfezione. Ora è tempo di studiarlo approfonditamente.
Le stranezze con WP_Query provenivano da questo articolo del 2008: http://weblogtoolscollection.com/archives/2008/04/19/paging-and-custom-wordpress-loops/
Pensavo che forse get_query_var stesse recuperando la stessa variabile, ma non mi è venuto in mente di prenderla direttamente con $_GET.
Ancora grazie mille. Combattevo con questo problema da un'eternità.

Ah cavolo. Vuoi continuare a combattere con me su questo? :)
Dopo aver testato la tua versione ho notato che non torna alla pagina 1. Rimane bloccata sulla pagina 2.
Inoltre, quando clicchi su una pagina diversa, resetta l'altro loop. È possibile concatenare queste variabili $_GET insieme in modo che ricordi http://foo.com/?paged_1=2&paged_2=3 ?

Non sono sicuro di cosa intendi con "rimane bloccata". Per quanto riguarda l'altro punto - sì, è quello che intendevo con l'ultima frase nella mia risposta. Dovrai concatenare i parametri 'base'
o 'format'
in modo che siano consapevoli dell'altro argomento di paginazione.

Ecco il bug che sto riscontrando: http://www.screenr.com/tmS8 Ecco il mio codice (lo stesso bug con il tuo codice letterale): http://paste.pocoo.org/show/573351/

Sembra funzionare perfettamente. Grazie mille Boone! Sei un genio di Ivy League. :D
Per curiosità, come funziona esattamente quel parametro 'add_args'? Ho guardato il Codex ma non è molto specifico.

add_args
consente di aggiungere un array di argomenti all'URL. È più chiaro nella documentazione in linea e nella funzione stessa: 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

puoi dare un'occhiata a questa domanda http://stackoverflow.com/questions/23841520/pagination-error-wordpress
