Query personalizzate e paginazione dei post

Avete creato un query personalizzata per tirare fuori dal database tutti i vostri post archiviati sotto un certa categoria. I post sono circa 200 e per evitare di caricare una pagina con così tanti articoli decidete saggiamente che sarebbe bene mostrarne un certo quantitativo per pagina o, magari, tanti quanti avete scelto di mostrarne nelle preferenze di WordPress. Subito dopo il loop, quindi, inserite la riga:
next_posts_link( "Pagina precedente" );
e poi questa:
previous_posts_link( "Pagina successiva" );
Però vi accorgete che i link non appaiono.
Questione di query
Il motivo è presto detto. Quando in una pagina statica (cioè una pagina creata ad hoc) create una nuova query, abbiate presente che esiste già una query principale che popola la variabile globale $wp_query
. In questa variabile, nel nostro caso della pagina statica creata appositamente, andranno le informazioni inerenti questa, come la data di creazione, il suo nome, il suo contenuto e tante altre. Le funzioni citate nelle due righe di sopra fanno riferimento proprio a questa variabile, infischiandosene della variabile popolata dalla query personalizzata.
Il punto sta, quindi, nel collegare le due funzioni poc’anzi citate alla query personalizzata. Lo si fa usando il secondo parametro che le due funzioni mettono a disposizione:
next_posts_link( $label, $max_pages );
previous_posts_link( $label, $max_pages );
Quel $max_pages
quindi diventerà:
next_posts_link( "Pagina precedente", $mia_variabile->max_num_pages );
previous_posts_link( "Pagina successiva", $mia_variabile->max_num_pages );
Quel $mia_variabile
è la variabile utilizzata per creare la query personalizzata, quella cioè che conterrà tutti i post e le loro informazioni, come ad esempio:
$mia_variabile = new WP_Query( $args );
Ma non finisce qui
Dopo aver collegato correttamente la funzione per la visualizzazione dei link alle pagine successiva e precedente, vi accorgete che la pagina 2 visualizza i post della prima, la 3 pure e così via.
Quest’altro punto va risolto aggiungendo un’ulteriore riga tra gli argomenti della query. Ad esempio:
$args = array(
'category_name' => 'mie-ricette',
'tag' => 'le-regionali',
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC',
'paged' => get_query_var( 'paged' )
);
$mia_variabile = new WP_Query( $args );
La riga che ci interessa è la 7. Con quella riga diciamo a WordPress di visualizzare la pagina (paged
) X che gli è stata fornita quando abbiamo fatto clic sul link Pagina successiva (o precedente). Altrimenti per lui paged
sarà sempre quello della prima.
Un esempio di tutto quanto fin qui detto lo trovate nelle mie pagine Featured posts, Guide su GNU/Linux e Guide su WordPress.
Note finali
1. Se volete che i post visualizzati in ogni pagina siano tanti quanti avete deciso nelle preferenze di WordPress, sostituite la riga 4 con questa:
'posts_per_page' => get_option( 'posts_per_page' ),
che va a prelevarsi proprio il valore impostato.
2. Se volete, poi, che l’output di next_posts_link
venga inserito in una variabile anziché visualizzato, utilizzate get_next_posts_link
e get_previous_posts_link
.
3. se utilizzate il plugin WP-PageNavi, sappiate che anch’esso può essere reindirizzato sulla query personalizzata in questo modo:
wp_pagenavi( array( "query" => $mia_variabile ) );
4. Come rilevato nei commenti a questo post e come descritto nel Codex, se la pagina statica è usata anche come homepage, le righe contenenti gli argomenti vanno modificate in tal senso:
$paged = ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1;
$args = array(
'category_name' => 'mie-ricette',
'tag' => 'le-regionali',
'posts_per_page' => 10,
'orderby' => 'date',
'order' => 'DESC',
'paged' => $paged
)
Grazie a Jonathan per la segnalazione.
Per approfondire
- La classe WP_Query
- Cosa è il Loop?
- La funzione next posts link nel Codex
- La funzione previous posts link nel Codex
- Il codice della funzione get_next_posts_link
- Il mio breve articolo sulle variabili di pagina
- Jeff Starr, Definitive Guide to WordPress Page Navigation
- WPCanyon, Solution if previous_posts_link() and next_posts_link() are not working