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_linkget_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