Per impostazione predefinita, WordPress eseguirà una query su ogni pagina visualizzata dal tuo sito, la cui natura sarà determinata dal tipo di pagina visualizzata. Quindi, se viene visualizzata una pagina statica, WordPress esegue una query per visualizzare la pagina con l'ID pertinente, mentre se viene visualizzata una pagina di archivio, la query recupererà tutti i post in quell'archivio.
Ma a volte vuoi fare le cose in modo un po 'diverso. Nel contenuto principale della tua pagina o altrove nella pagina (come nella barra laterale o nel piè di pagina), potresti voler visualizzare del contenuto specifico che non viene prodotto dalla query standard.
La grande notizia è che WordPress rende possibile ciò con WP_Query
classe. Questa classe ti fornisce un gran numero di parametri che puoi usare per definire quali contenuti vuoi esportare (che non devono essere limitati ai post) e poi scrivere un ciclo che mostrerà il contenuto esattamente come vuoi.
In questa serie di diciannove parti su Mastering WP_Query
, Baris Unver e io ti condurremo attraverso i dettagli di WP_Query
in modo che una volta completata la serie, sarai in grado di usarla in una varietà di scenari e perfezionare il modo in cui WordPress interroga i dati nel database del tuo sito.
In questa introduzione parlerò di quanto segue:
WP_Query
?WP_Query
?WP_Query
è una classe fornita da WordPress. Il fatto che si tratti di una classe significa che, usandolo, è possibile accedere rapidamente alle variabili, ai controlli e alle funzioni che sono stati codificati in quella classe nel core di WordPress, senza doversi preoccupare di scrivere tutto quel codice da soli. Questo rende il tuo codice più efficiente e affidabile.
Se vuoi capire esattamente come WP_Query
funziona sotto il cofano, puoi vedere il suo codice nel includes / query.php
file.
WP_Query
consiste di quattro elementi principali:
In pratica questo sarà simile al seguente:
have_posts ()) // Inizia il ciclo sui risultati della query. while ($ query-> have_posts ()) $ query-> the_post (); // I contenuti dei risultati dei post interrogati vanno qui. // Ripristina i dati del post originale. wp_reset_postdata (); ?>
Puoi definire i tuoi argomenti quando scrivi la query stessa, ma preferisco definirli per primi, dato che mantiene le cose in ordine.
Nell'esempio sopra ho aggiunto wp_reset_postdata ()
dopo ogni query. Questo è importante perché reimposta la query alla query principale in esecuzione su quella pagina.
Ad esempio, se stai usando WP_Query
per eseguire una query nella barra laterale, utilizzando wp_reset_postdata ()
dice a WordPress che siamo ancora su qualunque pagina venga visualizzata e che dovrebbe funzionare con la query predefinita per quella pagina.
Se non si esegue questa operazione, eventuali altre query eseguite nella pagina (inclusa la query predefinita) potrebbero interrompersi e qualsiasi tag condizionale che verifica il tipo di pagina visualizzata non funzionerà.
Se non hai usato il WP_Query
prima, potresti chiederti perché dovresti iniziare. Qui mi concentrerò su due aspetti di questo: perché usare WP_Query
su altri metodi di scrittura di query personalizzate e scenari in cui potresti voler utilizzare WP_Query
.
WP_Query non è l'unico metodo per la creazione di una query personalizzata. Ce ne sono altri quattro:
pre_get_posts
get_posts ()
get_pages ()
query_posts ()
(che dovresti evitare, come spiegherò)Non ho intenzione di entrare in molti dettagli su come ognuno di questi lavori, ma è utile sapere quando vengono utilizzati:
pre_get_posts
è un hook che modifica la query principale. Puoi usarlo con un tag condizionale per verificare se un determinato tipo di pagina viene visualizzato (ad esempio la home page) e quindi utilizzarlo per modificare la query eseguita (ad esempio per rimuovere i tre post più recenti, se tu? mostrandoli altrove sulla pagina). È un modo molto efficiente di modificare la query principale e dovrebbe essere il tuo primo punto di riferimento se è quello che vuoi fare. Tuttavia non è possibile utilizzarlo per creare una query completamente nuova.get_posts ()
e get_pages ()
sono molto simili, con la differenza principale che è evidente dal loro nome. Questi tag modello usano effettivamente il WP_Query
classe, quindi sono un altro modo di fare la stessa cosa, ma aggiungere un ulteriore passaggio perché chiamano il WP_Query
classe invece di farlo direttamente. Puoi usarli solo per interrogare post o pagine, mentre WP_Query
è di per sé più potente e ti consente di interrogare quasi tutto ciò che è contenuto nel tuo database.query_posts ()
modifica la query principale ma non deve essere utilizzata in plugin o temi. Questo perché getta la query principale e ricomincia da capo, sostituendo la query principale con una nuova query. È inoltre soggetto a errori, in particolare all'impaginazione, ed è inefficiente e influenzerà i tempi di caricamento della pagina. Se è necessario modificare la query principale, utilizzare pre_get_posts
invece, e se vuoi creare una query completamente nuova, usa WP_Query
.Lo schema qui sotto, pubblicato da Andrey "Rarst" Savchenko sotto licenza Creative Commons, dà un senso a questo:
Ci sono molti scenari in cui WP_Query
tornerà utile, e non posso coprirli tutti qui, ma ecco una panoramica:
Il WP_Query
la classe è grande. Creo molti siti che richiedono query personalizzate, quindi lo uso spesso. Ma non viene senza i suoi lati negativi. Ecco alcune cose di cui dovresti essere a conoscenza:
WP_Query
. Invece, è sufficiente creare un file modello per quell'archivio o tipo di contenuto e modificare il ciclo in quel file modello.WP_Query
per creare un'intera nuova query. Invece usa pre_get_posts
per modificare la query principale, insieme a un tag condizionale per individuare dove esattamente si vuole farlo.Il WP_Query
class è uno strumento potente ed estremamente utile per creare query personalizzate e per far sì che il tuo sito WordPress si comporti esattamente come desideri. Come abbiamo visto, ci sono momenti in cui si usano altri metodi per creare query personalizzate, ma ha una vasta gamma di usi.
Nel resto di questa serie, ti mostreremo i dettagli su come utilizzare WP_Query
e ottenere il massimo da esso.