Come far funzionare next_posts_link() con una query personalizzata in WordPress
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.

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.

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

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

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.

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.

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
