Loop-uri WP_Query multiple cu Paginare
Există câteva întrebări despre acest subiect (iar paginarea WP_Query pare să fie o întrebare majoră pentru mulți dezvoltatori), așa că încerc să clarific exact cum să o fac să funcționeze.
Pot să creez un singur loop personalizat cu paginare folosind acest cod:
// 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();
// Articolul
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;
...dar în mod natural, dacă copiez/lipesc acest loop, funcționează ca o clonă exactă, ceea ce înseamnă că atunci când dai click pe "Pagina 2" te duce la Pagina 2 pentru AMBELE loop-uri.
Există vreo modalitate de a separa aceste loop-uri astfel încât fiecare să aibă propria sa paginare?
Aici este codul complet împreună cu loop-ul duplicat dacă cineva este interesat să-l testeze local: http://paste.pocoo.org/show/573108/
Da, se poate realiza. Cheia este să faci parametrul format
diferit pentru cele două interogări:
<!-- Pisici -->
<div class="animals">
<?
$paged1 = isset( $_GET['paged1'] ) ? (int) $_GET['paged1'] : 1;
$paged2 = isset( $_GET['paged2'] ) ? (int) $_GET['paged2'] : 1;
// Buclă Personalizată cu Paginare 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>
<!-- Câini -->
<div class="animals">
<?
// Buclă Personalizată cu Paginare 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>

Mulțumesc mult pentru răspuns, Boone. Înțeleg ce spui, dar de fiecare dată când încerc să modific get_query_var, primesc o eroare.
Iată codul actualizat: http://paste.pocoo.org/show/573208/
Eroarea:
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

Două lucruri: 1) Faci niște lucruri ciudate cu globalul $wp_query
. (2) Există câteva ciudățenii de implementare în WP_Query
însuși care fac imposibilă utilizarea get_query_var()
și a altor funcții cu el, așa că de obicei mă refer direct la superglobalul $_GET
, asigurându-mă că sănătățesc prin conversie la int
. Am actualizat răspunsul meu cu un exemplu funcțional complet.

Super, Boone! Mulțumesc mult, funcționează perfect. E timpul să-l studiez în detaliu.
Lucrurile ciudate cu WP_Query erau din acest articol din 2008: http://weblogtoolscollection.com/archives/2008/04/19/paging-and-custom-wordpress-loops/
M-am gândit că poate get_query_var preia aceeași variabilă, dar nu mi-a venit ideea să o iau direct cu $_GET.
Din nou, mulțumesc mult, omule. M-am luptat cu asta de o veșnicie.

Ah, la naiba. Vrei să continuăm să luptăm împreună cu asta? :)
După ce am testat versiunea ta, am observat că nu revine la pagina 1. Se blochează pe pagina 2.
De asemenea, când dai click pe o pagină diferită, resetează celălalt loop. Este posibil să înlănțuim aceste variabile $_GET împreună astfel încât să-și amintească http://foo.com/?paged_1=2&paged_2=3 ?

Nu sunt sigur ce înțelegi prin "se blochează". În ceea ce privește celălalt punct - da, la asta m-am referit cu ultima propoziție din răspunsul meu. Va trebui să concatenezi parametrii 'base'
sau 'format'
astfel încât să fie conștienți de celălalt argument de paginare.

Iată bug-ul pe care îl întâlnesc: http://www.screenr.com/tmS8 Iată codul meu (același bug apare și în codul tău copiat exact): http://paste.pocoo.org/show/573351/

Pare să funcționeze perfect. Mulțumesc mult, Boone! Ești un geniu de la Ivy League. :D
Din curiozitate, cum funcționează exact parametrul 'add_args'? Am verificat în Codex dar nu e foarte specific.

add_args
vă permite să adăugați un array de argumente în URL. Este mai clar în documentația inline și în funcția în sine: 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

poți arunca o privire la această întrebare http://stackoverflow.com/questions/23841520/pagination-error-wordpress
