Funcția next_posts_link() funcționează doar cu $wp_query original

30 dec. 2012, 00:34:35
Vizualizări: 19.6K
Voturi: 9

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

0
Toate răspunsurile la întrebare 3
3
12

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.

30 dec. 2012 02:16:50
Comentarii

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

Andy Giesler Andy Giesler
16 mai 2013 18:27:13

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.

s_ha_dum s_ha_dum
16 mai 2013 18:33:56

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.

Andy Giesler Andy Giesler
16 mai 2013 22:54:44
0

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

30 dec. 2012 02:16:17
0

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

17 mai 2022 04:26:30