Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Gestire le query di WordPress con la classe WP_Query

Impariamo a prendere il controllo del loop e delle query di WordPress con la classe WP Query.
Impariamo a prendere il controllo del loop e delle query di WordPress con la classe WP Query.
Link copiato negli appunti

Uno dei meccanismi fondamentali del funzionamento di WordPress è il loop, la cui sintassi fondamentale, suggerita dalla documentazione ufficiale, è la seguente:

<?php if(have_posts()) : while (have_posts()) : the_post();
// Gestione dei contenuti tramite metodi come the_title, the content, the_date...
?>
<?php endwhile; ?>
<?php endif; ?>

Il metodo have_posts restituisce i risultati di una query che viene implicitamente generata per ogni pagina creata dal CMS: ad esempio, se vogliamo vedere il contenuto di una pagina specifica, al motore interno di WordPress verrà passato come parametro l'id della pagina in questione tramite un parametro GET (eventualmente sovrascritto tramite permalink). Il metodo the_post ci consente di accedere ai risultati ottenuti dalla query tramite metodi come the_title e the_post e, inoltre, rende disponibile l'oggetto $post per ciascun ciclo.

Nella home page del sito, per impostazione predefinita, la query restituirà gli ultimi post pubblicati, tramite i parametri di post_type, di numero di risultati e di offset per la paginazione.

Loop personalizzati con WP_Query

Non possiamo tuttavia utilizzare sempre l'automatismo di generazione interna delle query se vogliamo creare pagine più flessibili, per le quali potremmo voler elencare particolari tipi di custom post type, oppure filtrare per una o più tassonomie o custom fields, e magari mostrare anche altre tipologie di contenuti all'interno di spazi appositi.

Per ottenere una maggiore flessibilità dobbiamo generare noi la query per creare un loop impostando i parametri di ricerca secondo le nostre esigenze specifiche.

Possiamo raggiungere questo importante risultato utilizzando la classe WP_Query, la stessa adottata dal motore interno per creare le query per le pagine predefinite. Anche il metodo query_posts può ottenere lo stesso risultato, ma la sua peculiarità è quella di alterare la query principale generata da WordPress, ed è quindi fortemente sconsigliato anche dalla community degli sviluppatori del CMS.

Essendo WP_Query una classe, dobbiamo creare una sua istanza tramite l'usuale operatore new, ma la parte più importate del lavoro è impostare i parametri di ricerca. Gli argomenti per la creazione dell'oggetto vengono passati alla classe con un array di coppie chiave - valore specificando, ad esempio, il custom post type, l'autore, e la tassonomia da utilizzare come parametri della ricerca. I parametri disponibili e il loro utilizzo vengono elencati nella pagina del Codex dedicata alla classe.

Supponiamo ad esempio di voler leggere i post pubblicati dall'autore con id 11, classificati sotto la categoria con slug "eventi", presentati in ordine ascendete sul titolo del post:

<?php
  $argomenti = array(
           'post_type' => 'post',
	         'author => 11,
	         'category_name' => 'eventi',
	         'orderby' => 'title',
	         'order' => 'ASC'
            ); // Imposto i parametri della ricerca
  $query = new WP_Query($argomenti); //Istanzio un oggetto
  if ($query->have_posts()) : while($query->have_posts()) : $query->the_post();
	// Gestione dei contenuti tramite metodi come the_title, the content, the_date...
	?>
  <?php endwhile; ?>
  <?php endif; ?>
  <?php wp_reset_query(); ?>

L'ultima riga del codice presentato è di particolare importanza: il metodo wp_reset_query ripristina tutti i parametri della query originale generata da WordPress per il contenuto della pagina o del post che stiamo caricando; questo ci consente di utilizzare più query, ad esempio nello stesso template, senza che interferiscano tra loro, neppure nel caso siano nidificate.

Due aspetti particolarmente delicati della costruzione dei parametri sono la paginazione e i parametri relativi alle tassonomie personalizzate di cui parleremo a breve.

Paginare i risultati

Per quanto riguarda la paginazione, a meno di non sovrascrivere i valori di default, il numero dei risultati sarà sempre determinato dal parametro "Le pagine del blog visualizzano al massimo" impostato nella sezione "lettura" delle impostazioni. Se non vogliamo paginare i risultati, ma ottenerli tutti occorre impostare nell'array dei parametri nopaging come true.

Per paginare correttamente i risultati dovremmo invece tener conto dei parametri posts_per_page e paged: il primo rappresenta il numero di post letti per ciascuna pagina, mentre il secondo il numero di pagina attuale. Leggendo il numero di pagina passato via query var (le variabili registrate e riconosciute da WordPress, passate via URL) è possibile costruire un codice di questo tipo:

<?php
        $numero_di_ pagina = get_query_var('paged'); //Lettura del numero di pagina
        $argomenti = array(
            'post_type' => 'post',
            'paged' => $numero_di_ pagina /*Il numero di pagina viene impostato come argomento*/
            );
        $query = new WP_Query($argomenti);
        if ($query->have_posts() ) : while ($query->have_posts() ) : $query->the_post();
	// Gestione dei contenuti
	?>
        <?php endwhile; ?>
        <?php endif; ?>
        <?php $pagine_totali = $query->max_num_pages;  /*Numero totale di pagine */
            if ($pagine_totali > 1){  //Se serve più di una pagina
          $pagina_corrente = max(1, $numero_di_ pagina);
          echo paginate_links(array(  //creo i link per la paginazione
              'current' => $pagina_corrente,
              'total' => $pagine_totali,
              'prev_text' => 'Precedente',
              'next_text' => 'Successiva'
            ));
        }
        wp_reset_query(); ?>

Il metodo max_num_pages riporta il numero massimo di pagine calcolato sulla base dei risultati trovati e il numero di contenuti per pagina. Conoscendo tutti i parametri essenziali possiamo richiamare la funzione di WordPress paginate_links che crea i link necessari per scorrere fra le pagine dei risultati.

WP_Query e le Custom Taxonomies

È possibile utilizzare anche le tassonomie personalizzate nella query, ma dovremmo prestare un po' più di attenzione alla scrittura del codice: il parametro tax_query necessario per questa operazione accetta un array di array, cioè un array per ciascuna eventuale tassonomia da inserire. Vediamo ad esempio come richiamare i post classificati sotto "php" con tassonomia "linguaggi":

<?php
$args = array(
	'post_type' => 'post',
	'tax_query' => array(
		array(
			'taxonomy' => 'linguaggi',
			'field' => 'slug', //È possibile utilizzare l'id o lo slug
			'terms' => 'php'
		)
	)
);
$query = new WP_Query( $args );
?>

Conclusioni

Conoscere WP_Query è essenziale per sfruttare al massimo le potenzialità di WordPress. Senza scrivere una sola riga di SQL otterremo i risultati di query anche molto complesse, come se utilizzassimo un ORM. Possono tuttavia darsi dei casi in cui le nostre esigenze non possano essere soddisfatte da questa classe, ed è quindi necessario accedere al database del CMS con uno strumento meno astratto (nella fattispecie l'oggetto globale $wpdb), in grado di interrogarne direttamente le tavole.

Ti consigliamo anche