In questa parte della serie su Mastering WP_Query
, imparerai alcuni degli argomenti che puoi usare con WP_Query
classe, cioè quelli per:
Puoi utilizzare questi argomenti per recuperare i post programmati dal database, per interrogare gli allegati, per modificare il modo in cui i post sono ordinati e per cosa sono ordinati, per specificare quanti post vengono visualizzati e molto altro
Ma prima che tu possa farlo, devi capire come funzionano gli argomenti WP_Query
.
Prima di iniziare, facciamo un rapido riassunto su come funzionano gli argomenti WP_Query
. Quando si codifica WP_Query
nei temi o nei plugin, è necessario includere 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 (); ?>
Gli argomenti sono ciò che dice a WordPress quali dati recuperare dal database e sono quelli che coprirò qui. Quindi tutto ciò su cui ci stiamo concentrando qui è la prima parte del codice:
$ args = array (// Argomenti per la tua query.);
Come puoi vedere, gli argomenti sono contenuti in un array. Imparerai come codificarli mentre lavori attraverso questo tutorial.
Esiste un modo specifico per codificare gli argomenti nell'array, che è il seguente:
$ args = array ('parameter1' => 'value', 'parameter2' => 'value', 'parameter3' => 'value');
È necessario includere i parametri e i relativi valori tra virgolette singole, utilizzare =>
tra di loro e separarli con una virgola. Se si sbaglia, WordPress potrebbe non aggiungere tutti i tuoi argomenti alla query o si potrebbe ottenere una schermata bianca.
Come saprai se hai mai convertito lo stato di un post da Bozza a Pubblicato, o magari messo nel cestino, WordPress assegna uno stato ad ogni post. Puoi usare il post_status
parametro per interrogare i post con uno o più stati.
Gli argomenti disponibili sono:
pubblicare
: Un post pubblicato o una pagina.in attesa di
: Post è in attesa di revisione.bozza
: Un post in stato di bozza.auto-progetto
: Un post appena creato, senza contenuti.futuro
: Un post da pubblicare in futuro.privato
: Non visibile agli utenti che non hanno effettuato l'accesso.ereditare
: Una revisione.spazzatura
: Il post è nel cestino.qualunque
: Recupera qualsiasi stato ad eccezione di quelli da stati di stato con 'Exclude_from_search'
impostato su true (vale a dire. spazzatura
e auto-progetto
).Se non si specifica uno stato negli argomenti della query, WordPress verrà impostato su pubblicare
; se l'utente corrente ha effettuato l'accesso, includerà anche i post con stato privato
. Se si esegue una query nelle pagine di amministrazione, WordPress includerà anche gli stati protetti, che sono futuro
, bozza
e in attesa di
per impostazione predefinita.
Supponiamo che tu stia eseguendo un sito di eventi e stai utilizzando un tipo di evento personalizzato, utilizzando la data di pubblicazione come la data in cui si verifica l'evento. Per impostazione predefinita, WordPress non visualizzerà eventi che non si sono ancora verificati: sebbene tu li abbia programmati, la loro data pianificata è in futuro, quindi il loro stato post è futuro.
Per aggirare questo basta usare questi argomenti:
$ args = array ('post_type' => 'event', 'post_status' => 'future');
Questo mostrerà solo quegli eventi che non sono ancora accaduti, poiché quelli avranno il pubblicare
stato. Ma se vuoi anche visualizzare gli eventi accaduti, puoi usare una serie di stati dei post per includerne più di uno:
$ args = array ('post_type' => 'event', 'post_status' => array ('future', 'publish'));
Il post_status
parametro è essenziale quando stai interrogando per gli allegati. Questo perché hanno uno stato di ereditare
, non pubblicare
. Quindi per richiedere tutti gli allegati, dovresti usare questo:
$ args = array ('post_type' => 'attachment', 'post_status' => 'inherit');
In alternativa puoi sostituire ereditare
con qualunque
che avrebbe lo stesso effetto.
Ci sono due parametri che usi per ordinare i post recuperati da WP_Query
: ordine
e ordinato da
. Come ti aspetteresti, ordine
definisce l'ordine in cui i messaggi saranno pubblicati nel ciclo e ordinato da
definisce quale campo nel database saranno ordinati per.
Iniziamo guardando gli argomenti per ordine
.
Ci sono solo due argomenti che puoi usare per questo:
ASC
: ordine ascendente dal più basso al più alto (1, 2, 3; a, b, c).DESC
: ordine decrescente dal più alto al più basso (3, 2, 1; c, b, a).Questi sono abbastanza auto-esplicativi. Se non includi un argomento per ordine
, WordPress verrà utilizzato per impostazione predefinita DESC
.
Puoi ordinare i tuoi post in base a una serie di campi:
nessuna
: Nessun ordine (disponibile con la versione 2.8).ID
: Ordina per post ID. Nota le lettere maiuscole.autore
: Ordina per autore.titolo
: Ordina per titolo.nome
: Ordina per posta lumaca.genere
: Ordina per tipo di post.Data
: Ordina per data.modificato
: Ordina per data dell'ultima modifica.genitore
: Ordina per post genitore / pagina.rand
: Ordine casuale.COMMENT_COUNT
: Ordina per numero di commenti.menu_order
: Ordina per ordine di pagina. Utilizzato più spesso per Pagine (utilizzando il valore aggiunto al metabox nella schermata Modifica pagina) e per Allegati (utilizzando i campi integer nella finestra di dialogo Inserisci / Carica galleria multimediale), ma potrebbe essere utilizzato per qualsiasi tipo di post con menu_order
abilitato.meta_value
: Ordina per il valore di una meta chiave (o campo personalizzato). Funziona solo se includi anche un meta_key
parametro nei tuoi argomenti. I metadati sono ordinati alfabeticamente e non numericamente (quindi 34 prima dei 4, ad esempio). meta_value_num
: Ordina per valore meta numerico. Come con meta_value
, devi anche includere a meta_key
argomento nella tua query.post__in
: Preservare l'ordine di post ID fornito in post__in
schieramento.L'impostazione predefinita è Data
, cioè la data di pubblicazione di un post.
Ad esempio, se desideri ordinare i tuoi post in base al titolo in ordine crescente, utilizzerai questi argomenti:
$ args = array ('orderby' => 'titolo', 'ordine' => 'ASC');
Non devi limitarti a un solo campo per ordinare i tuoi post. Per ordinare in base a più campi, utilizzare un array con ordinato da
parametro e (facoltativamente) con ordine
parametro se si desidera ordinare ciascun campo in un ordine diverso.
Supponiamo che tu abbia un campo personalizzato di valutazioni che desideri utilizzare per l'ordinamento in un sito di e-commerce. Puoi ordinare per valutazione e quindi titolo, entrambi in ordine crescente, in questo modo:
$ args = array ('orderby' => array ('meta_value_num', 'title'), 'order' => 'ASC', 'meta_key' => 'rating');
Nota che ho incluso il meta_key
argomento per far sapere a WordPress quale campo personalizzato sto usando. Lo fai a causa del modo in cui WordPress memorizza i metadati dei post: non in wp_posts
tavolo, ma nel wp_postmeta
tavolo.
Ma cosa succede se si desidera ordinare in base alla classificazione in ordine decrescente e quindi in ordine crescente? Devi semplicemente usare un altro array:
$ args = array ('orderby' => array ('meta_value_num', 'title'), 'order' => array ('DESC', 'ASC'), 'meta_key' => 'rating');
È inoltre possibile ordinare per più campi quando non si utilizzano i metadati del post, ad esempio per ordinare per tipo di post e quindi per data:
$ args = array ('orderby' => array ('type', 'date'), 'order' => array ('ASC', 'DESC'));
Questo ordinerebbe per tipo di messaggio in ordine crescente e quindi all'interno di ciascun tipo di messaggio, per data in ordine decrescente.
Il prossimo set di parametri che incontriamo sono per l'impaginazione. Questi ti aiutano a definire il numero di post che verranno interrogati e come funzionerà la paginazione quando vengono pubblicati.
I parametri disponibili sono:
nopaging
(booleano): Mostra tutti i post o usa la paginazione. L'impostazione predefinita è 'False'
, ad esempio utilizzare l'impaginazione.posts_per_page
(int): Numero di post da mostrare per pagina.posts_per_archive_page
(int): Numero di post da mostrare per pagina, solo sulle pagine di archivio.compensare
(int): Numero di messaggi a spostare o passare sopra.paging
(int): La pagina nell'archivio da cui vengono mostrati i post.pagina
(int): Numero di pagine per una prima pagina statica. Mostra i post che verrebbero normalmente visualizzati solo sulla pagina X di una pagina iniziale statica.ignore_sticky_posts
(booleano): Ignora post stickiness-default su falso
.Diamo un'occhiata ad alcuni esempi.
Ad esempio, per visualizzare i cinque post più recenti:
$ args = array ('posts_per_page' => '5');
O per visualizzare cinque post recenti escluso il più recente:
$ args = array ('posts_per_page' => '5', 'offset' => '1');
Tieni presente che sebbene tu stia recuperando i post dei sei post più recenti nel database, lo usi ancora 'posts_per_page' => '5'
dato che è il numero di post che verranno pubblicati.
Facendo un po 'di più, puoi scrivere due domande: una per visualizzare il post più recente e una seconda per visualizzare altri dieci post che escludono quel post:
$ args = array ('posts_per_page' => '1'); // Query e loop vanno qui oltre a reimpostare i post. $ args = array ('posts_per_page' => '10', 'offset' => '1'); // Seconda query, loop e ripristino andare qui.
Puoi anche usare posts_per_page
da visualizzare tutti post:
$ args = array ('posts_per_page' => '-1');
Normalmente i tuoi post appiccicosi verranno visualizzati per primi in qualsiasi query: se vuoi sovrascriverli, usa ignore_sticky_posts
:
$ args = array ('posts_per_page' => '5', 'ignore_sticky_posts' => true);
Gli argomenti sopra riportati restituiranno i cinque post più recenti indipendentemente dal fatto che siano appiccicosi o meno.
Si noti che se si desidera visualizzare solo post appiccicosi, è necessario utilizzare il get_option ()
funzione e il post__in
argomento come segue:
$ sticky = get_option ('sticky_posts'); $ args = array ('posts_per_page' => '5', 'post__in' => $ sticky);
Quanto sopra mostrerebbe gli ultimi cinque post appiccicosi: se ci sono meno di cinque (ad esempio tre) post appiccicosi, non mostrerà post non appiccicosi ma solo i tre post più appiccicosi più recenti.
Oltre a definire il numero di post recuperati dal database, puoi anche utilizzare i parametri di impaginazione per definire in che modo i post risultanti verranno impaginati nelle pagine di archivio e di ricerca.
Ad esempio, in una pagina di archivio, è possibile utilizzare questo codice per visualizzare 20 post per pagina nell'archivio:
$ args = array ('posts_per_archive_page' => '20');
Notare la posts_per_archive_page
argomento avrà la precedenza posts_per_page
.
Puoi anche scegliere di stampare solo le pagine che verrebbero visualizzate su una determinata pagina in pagine impaginate. Ad esempio, se volessi mostrare i 20 post che verrebbero visualizzati nella terza pagina dell'esempio precedente, utilizzerai questo:
$ args = array ('posts_per_archive_page' => '20', 'paged' => '3');
Un modo alternativo per interrogare gli stessi messaggi sarebbe utilizzare il compensare
discussione:
$ args = array ('posts_per_page' => '20', 'offset' => '40');
Salta i primi 40 post (che si trovano nelle prime due pagine di archivio) e recupera i prossimi 20 post (che si trovano nella terza pagina di archivio. Una delle cose che amo di WordPress è come spesso ti dà più di un modo per ottenere qualcosa!
Puoi anche disattivare completamente l'impaginazione, per assicurarti che tutti i post vengano visualizzati nella stessa pagina:
$ args = array ('nopaging' => true);
Il WP_Query
ti offre molta flessibilità quando si tratta di determinare quanti post si desidera interrogare, in quale ordine si desidera visualizzarli e quale stato del post si desidera mostrare.
Alcuni di questi argomenti sono essenziali per l'interrogazione di determinati tipi di post (ad esempio 'post_status' => 'inherited'
per gli allegati), mentre altri semplicemente ti danno un maggiore controllo sul modo in cui le query vengono eseguite.
Utilizzando questi parametri è possibile creare query personalizzate che fanno molto di più che semplicemente l'output dei post pubblicati più recenti.