Come far funzionare next_posts_link() con una query personalizzata in WordPress

30 dic 2012, 00:34:35
Visualizzazioni: 19.6K
Voti: 9

Ho un template personalizzato in cui voglio visualizzare post del blog impaginati. Questo è l'inizio del mio file:

$wp_query = new WP_Query($args);
    if($wp_query->have_posts()){
        while($wp_query->have_posts()){ $wp_query->the_post();
            //qualcosa...
    <?php next_posts_link('Post più vecchi'); ?>
    <?php previous_posts_link('Post più recenti'); ?>

Funziona bene - mostra i link POST PIÙ VECCHI e POST PIÙ RECENTI quando dovrebbe. Nella prima pagina mostra solo il link ai post più vecchi. Nella seconda pagina entrambi i link, sia ai post più recenti che a quelli ancora più vecchi, ecc.

Ma non voglio sovrascrivere l'attuale $wp_query... Vorrei usare, diciamo, $wp_query2 per questo loop. E i link non appaiono affatto se faccio così.

Secondo questa documentazione: http://codex.wordpress.org/Function_Reference/next_posts_link queste funzioni stampano un link al set precedente/successivo di post all'interno della query corrente. Presumo che $wp_query2 non sia la mia "QUERY CORRENTE" ma $wp_query lo è sempre. Posso cambiare questo comportamento in qualche modo?

AGGIORNAMENTO: Aggiungendo &paged=2 manualmente al link lo fa correttamente andare al set successivo di post (pagina successiva) e nella seconda, terza pagina ecc. previous_posts_link() funziona anche se uso $wp_query2. Quindi, mi manca solo la funzionalità di next_posts_link() su ogni pagina.

0
Tutte le risposte alla domanda 3
3
12

next_posts_link e previous_posts_link utilizzano la query globale $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

Ciò significa che devi fare qualcosa del genere per farli funzionare correttamente.

$orig_query = $wp_query;
$wp_query = new WP_Query($args);
// il resto del tuo codice
$wp_query = $orig_query;

Se hai finito di utilizzare $wp_query per quel caricamento di pagina non c'è motivo di preservarlo. Dovrebbe essere abbastanza semplice copiare quelle funzioni core, modificarle per accettare un parametro di query e creare le tue funzioni di impaginazione.

30 dic 2012 02:16:50
Commenti

Grazie. Più sottile che semplicemente sovrascrivere $wp_query. Le funzioni *_post_link utilizzano $wp_query solo per calcolare il valore del parametro $max_pages, quindi una discussione su Stack Overflow consiglia semplicemente di passare quel valore piuttosto che sovrascrivere $wp_query. Il che sembra più semplice in un certo senso, ma mi rende un po' nervoso poiché presuppone che le future versioni di WP si comporteranno allo stesso modo (non garantito: non fa parte dell'API/contratto, ma si basa sulla conoscenza della gestione interna delle variabili del codice). http://stackoverflow.com/questions/14364488/wordpress-pagination-next-posts-link-on-custom-wp-query-not-showing

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

È un buon punto ma stai ripristinando la variabile quindi sovrascrivere $wp_query non dovrebbe essere un problema. Onestamente, raramente incontro questo problema-- pre_get_posts lo rende abbastanza facile da evitare.

s_ha_dum s_ha_dum
16 mag 2013 18:33:56

Scusa, sono stato poco chiaro. Sono d'accordo, il tuo metodo è sicuro. Il mio commento sul rischio si riferiva alla soluzione di Stack Overflow. Quell'altra soluzione sembra più semplice in superficie (basta aggiungere un parametro), ma si basa su presupposti riguardanti il funzionamento interno del codice core di WordPress... molto probabilmente sicuro, ma il funzionamento interno del codice può cambiare. +1 alla tua soluzione perché sembra più a prova di futuro.

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

Guardando il sorgente di WordPress, sembra che next_posts_link utilizzi la variabile globale $paged. La mia ipotesi è che questo funzioni solo per il loop principale.

Una soluzione piuttosto valida per far funzionare l'impaginazione per loop secondari si trova qui: http://weblogtoolscollection.com/archives/2008/04/19/paging-and-custom-wordpress-loops/

Implica l'impostazione esplicita della variabile di query paged nella query, in questo modo:

<h3>Articoli Recenti</h3>
<ul>
<?php 
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$wp_query->query('showposts=5'.'&paged='.$paged);
?>

Spero che questo sia d'aiuto.

30 dic 2012 02:16:17
0

Mi sono imbattuto nello stesso problema. Ho dei loop annidati, quindi nel loop interno sto utilizzando $wp_query = new WP_Query($args); invece del WP_Query globale. La soluzione che ho adottato è stata quella di passare esplicitamente max_num_pages alla funzione next_posts_link. Questo è stato menzionato nei commenti anche da Andy Giesler.

Soluzione:

<?php  
  //loop esterno  
    //codice esterno
    //inizia loop interno
      $inner_query = new WP_Query( 
                array('posts_per_page' => '4', 'paged' => get_query_var('paged')) 
            ); 
        // ...codice per mostrare tutti i post ecc.  
      previous_posts_link( 'Post più vecchi' ); 
      next_posts_link( 'Post più recenti', $inner_query->max_num_pages ); //Nota questo
    //fine loop interno
    //altro codice del loop esterno  
  //fine loop esterno
?>  

Il motivo per cui dobbiamo fare così è che WordPress internamente utilizza la proprietà $max_page del WP_query globale, che se non è definita avrà come valore predefinito $max_page = 0

17 mag 2022 04:26:30