Funcția next_posts_link() funcționează doar cu $wp_query original
Am un șablon personalizat în care vreau să afișez articolele paginate din blog. Acesta este începutul fișierului meu:
$wp_query = new WP_Query($args);
if($wp_query->have_posts()){
while($wp_query->have_posts()){ $wp_query->the_post();
//ceva cod...
<?php next_posts_link('Articole mai vechi'); ?>
<?php previous_posts_link('Articole mai noi'); ?>
Funcționează corect - afișează linkurile pentru ARTICOLE MAI VECHI și ARTICOLE MAI NOI când ar trebui. Pe prima pagină va afișa doar un link către articolele mai vechi. Pe a doua pagină afișează atât linkuri către articole mai noi cât și către cele și mai vechi etc.
Dar nu vreau să suprascriu interogarea curentă $wp_query
... Vreau să folosesc, să zicem, $wp_query2
pentru această buclă. Și linkurile nu apar deloc dacă fac asta.
Conform acestui http://codex.wordpress.org/Function_Reference/next_posts_link aceste funcții afișează un link către setul anterior/următor de articole din cadrul interogării curente. Presupun că $wp_query2
nu este "INTEROGAREA CURENTĂ", dar $wp_query
întotdeauna este. Pot schimba cumva acest comportament?
ACTUALIZARE:
Adăugând manual &paged=2
la link face ca acesta să meargă corect la următorul set de articole (următoarea pagină) și pe a doua, a treia etc. pagină previous_posts_link()
funcționează chiar dacă folosesc $wp_query2
. Așadar, îmi lipsește doar funcționalitatea next_posts_link()
pe fiecare pagină.
next_posts_link
și previous_posts_link
folosesc variabila globală $wp_query
.
function get_next_posts_link( $label = null, $max_page = 0 ) { global $paged, $wp_query;
http://core.trac.wordpress.org/browser/tags/3.5/wp-includes/link-template.php#L1523
Aceasta înseamnă că trebuie să faceți ceva de genul acesta pentru a le face să funcționeze corect.
$orig_query = $wp_query;
$wp_query = new WP_Query($args);
// restul codului tău
$wp_query = $orig_query;
Dacă ați terminat cu $wp_query
pentru acea încărcare de pagină, nu există niciun motiv să o păstrați. Ar trebui să fie destul de ușor să copiați acele funcții din nucleu, să le modificați pentru a accepta un parametru de interogare și să vă creați propriile funcții de paginare.

Mulțumesc. Mai subtil decât simpla suprascriere a $wp_query. Funcțiile *_post_link folosesc $wp_query doar pentru a calcula valoarea parametrului $max_pages, așa că o discuție de pe Stack Overflow recomandă să transmitem pur și simplu acea valoare în loc să suprascriem $wp_query. Ceea ce pare mai simplu într-un fel, dar mă face puțin neliniștit deoarece presupune că versiunile viitoare ale WP vor acționa în același mod (nu este garantat: nu face parte din API/contract, ci se bazează pe cunoașterea modului intern de gestionare a variabilelor din cod). http://stackoverflow.com/questions/14364488/wordpress-pagination-next-posts-link-on-custom-wp-query-not-showing

Acesta este un punct bun, dar tu pui variabila înapoi, așa că suprascrierea $wp_query
nu ar trebui să fie o problemă. Sincer, rareori întâlnesc această problemă - pre_get_posts
o face destul de ușor de evitat.

Scuze, am fost neclar. Sunt de acord, metoda ta este sigură. Comentariul meu despre riscuri se referea la soluția de pe Stack Overflow. Acea altă soluție pare mai simplă la suprafață (doar adaugă un parametru), dar se bazează pe presupuneri despre funcționarea internă a codului WordPress... cel mai probabil sigură, dar funcționarea internă a codului se poate schimba. +1 soluția ta pentru că pare mai rezistentă la schimbări viitoare.

Analizând codul sursă al WordPress, se pare că next_posts_link utilizează variabila globală $paged. Presupun că aceasta va funcționa doar pentru bucla principală.
O soluție destul de bună pentru a face paginarea să funcționeze pentru buclele secundare este prezentată aici: http://weblogtoolscollection.com/archives/2008/04/19/paging-and-custom-wordpress-loops/
Presupune setarea explicită a variabilei de interogare paged în query, astfel:
<h3>Articole recente</h3>
<ul>
<?php
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$wp_query->query('showposts=5'.'&paged='.$paged);
?>
Sper că acest lucru vă ajută.

Am întâmpinat aceeași problemă. Am bucle imbricate, așa că în bucla interioară folosesc $wp_query = new WP_Query($args);
în loc de globalul WP_Query
. Soluția pe care am folosit-o a fost să transmit explicit max_num_pages
funcției next_posts_link
. Acest lucru a fost menționat în comentarii și de Andy Giesler.
Soluție:
<?php
//bucla exterioară
//niște cod exterior
//începe bucla interioară
$inner_query = new WP_Query(
array('posts_per_page' => '4', 'paged' => get_query_var('paged'))
);
// ...cod pentru afișarea postărilor etc.
previous_posts_link( 'Postări mai vechi' );
next_posts_link( 'Postări mai noi', $inner_query->max_num_pages ); //Observați acest lucru
//se termină bucla interioară
//alt cod pentru bucla exterioară
//se termină bucla exterioară
?>
Motivul pentru care trebuie să facem acest lucru este că WordPress intern folosește proprietatea $max_page
din globalul WP_query, care dacă este nedefinită, valoarea implicită va fi $max_page = 0
