In questa parte di questa serie WP_Query
, imparerai come usare WP_Query
per richiedere post, pagine e tipi di post personalizzati. Puoi eseguire query per post e pagine specifici oppure puoi eseguire una query per restituire post di uno o più tipi di post.
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.
Iniziamo con lo scenario più semplice: eseguire una query per trovare un post o una pagina specifici.
Per trovare un post specifico (o una serie di post), hai due opzioni:
p
(int): Utilizza l'ID post.nome
(stringa): Usa la slug post.Puoi utilizzare questi parametri con qualsiasi tipo di post inclusi post, pagine, allegati e tipi di post personalizzati. Di default WordPress richiederà il 'inviare'
post tipo e non ritorno pagine o tipi di post personalizzati - se vuoi farlo devi aggiungere più argomenti o usare un argomento diverso, che verrò più avanti in questo tutorial.
Quindi, per restituire un post specifico, useresti uno di questi:
$ args = array ('p' => '32');
o:
$ args = array ('name' => 'post_slug');
Si noti che il nome
parametro prende il post slug come argomento, non il suo titolo.
Usando il nome
parametro semplifica l'identificazione di ciò che la query recupererà dal database quando si rivisiterà il codice in un secondo momento, ma c'è il rischio che non funzioni se uno degli utenti del tuo sito cambia il post slug. L'ID post non può essere modificato, quindi questo è più sicuro.
Per richiedere una pagina specifica hai di nuovo due opzioni:
page_id
(int): Utilizza l'ID della pagina.pagename
(stringa): Usa slug di pagina.Quindi, per eseguire una query che recupera solo una pagina specifica dal database, devi utilizzare uno di questi:
$ args = array ('page_id' => '20');
o:
$ args = array ('pagename' => 'page_slug');
Per eseguire una query per un post di un altro tipo di post, incluso un tipo di post personalizzato, devi utilizzare anche il post_type
parametro. Tratterò questo aspetto un po 'più in dettaglio in questo tutorial, ma in breve, per richiedere un singolo post in Prodotto
tipo di post personalizzato, dovresti usare questo:
$ args = array ('p' => '46', 'post_type' => 'prodotto');
Oppure per richiedere un allegato, devi utilizzare:
$ args = array ('p' => '46', 'post_type' => 'attachment');
A volte potrebbe essere necessario recuperare tutte le pagine che sono figli di una determinata pagina, ad esempio se il sito ha una struttura gerarchica delle pagine e si desidera visualizzare un elenco su ciascuna pagina dei figli di quella pagina.
Nota: non lo farei con i post in quanto non sono gerarchici, sebbene sia possibile con un tipo di post personalizzato se è gerarchico.
Hai tre argomenti che puoi usare per fare questo:
post_parent
(int): Utilizza l'ID pagina per restituire solo le pagine figlio. Impostare su 0 per restituire solo le voci di primo livello.post_parent__in
(schieramento): Utilizza una serie di ID post.post_parent__not_in
(schieramento): Utilizza una serie di ID post.Diamo un'occhiata a ciascuno di essi.
Il primo, post_parent
, ti consente di interrogare per pagine che sono figli di una pagina specifica.
Quindi per trovare tutte le pagine che sono figli di una determinata pagina, dovresti usare questo:
$ args = array ('post_type' => 'page', 'post_parent' => '2');
Nota che devi includere il post_type
argomento come il tipo di post predefinito che WP_Query
cerca è inviare
.
Prendendo questo ulteriormente, questo è come lo useresti per trovare i bambini della pagina corrente:
$ current_page_id = get_the_ID (); $ args = array ('post_type' => 'pagina', 'post_parent' => $ current_page_id);
È inoltre possibile utilizzare questo parametro per identificare le pagine di livello superiore, ad esempio quelle senza un genitore:
$ args = array ('post_type' => 'page', 'post_parent' => '0');
Ma cosa succede se si desidera identificare i bambini di più pagine? Puoi farlo anche tu, con il post_parent__in
parametro. Questo richiede una serie di ID post.
Quindi, per interrogare i figli di due delle tue pagine, dovresti usare questo:
$ args = array ('post_type' => 'pagina', 'post_parent__in' => array ('2', '4'));
È inoltre possibile escludere le pagine secondarie dalla query, utilizzando il comando post_parent__not_in
parametro:
$ args = array ('post_type' => 'pagina', 'post_parent__not_in' => array ('2', '4'));
È anche comune eseguire una query per includere o escludere più post. Hai due argomenti che puoi usare per questo:
post__in
(schieramento): Utilizza post ID.post__not_in
(schieramento): Utilizza post ID.Il post__in
argomento può essere utilizzato per tutti i tipi di post e accetta un array di ID. Quindi, per generare un elenco di post specifici, dovresti usare questo:
$ args = array ('post__in' => array ('36', '52', '246', '354'));
Nota: se si utilizza questo argomento per recuperare i post, WordPress recupera comunque post di appiccicosità, anche se non sono presenti nell'elenco. Per ometterli, usi il ignore_sticky_posts
discussione:
$ args = array ('post__in' => array ('36', '52', '246', '354'), 'ignore_sticky_posts' => 'true');
Il post__not_in
argomento funziona in un modo simile, sempre prendendo una serie di post ID, ma produrrà tutto il resto tranne i post elencati. Normalmente lo combinerai con altri argomenti per evitare di emettere un enorme elenco di post.
Quindi, per interrogare tutti i messaggi di Prodotto
inserisci il tipo ma escludi alcuni:
$ args = array ('post_type' => 'product', 'post__not_in' => array ('36', '52', '246', '354'));
Quindi, per combinare questo con uno dei nostri esempi precedenti, ecco come richiederebbe tutte le pagine di primo livello tranne quella attuale:
$ current_page_ids = array (get_the_ID ()); $ args = array ('post_parent' => '0', 'post__not_in' => $ current_page_ids);
Nota che se hai registrato anche un tipo di messaggio gerarchico, devi includere il post_type
parametro in questo codice per richiedere solo le pagine.
In alcuni degli esempi sopra ho usato il post_type
parametro per identificare i post di un certo tipo. Diamo un'occhiata agli argomenti che puoi usare con quel parametro:
inviare
: Un post.pagina
: Una pagina.revisione
: Una revisione.attaccamento
: Un allegato.nav_menu_item
: Una voce del menu di navigazione.qualunque
: Recupera qualsiasi tipo tranne revisioni e tipi con 'Exclude_from_search'
impostato vero
quando sono stati registrati.Prodotto
).Come abbiamo visto sopra, puoi utilizzare questo parametro con altri argomenti per rendere la tua query più specifica.
Quindi, per dare un semplice esempio, ecco come interrogare per tutte le pagine del tuo sito:
$ args = array ('post_type' => 'pagina');
La ricerca di un tipo di post personalizzato è semplice: usa il nome che hai assegnato al tipo di post quando lo si registra, non il titolo utilizzato nei menu di amministrazione. Quindi diciamo che hai registrato i tipi di post del tuo prodotto usando register_post_type ()
come segue:
function register_product () $ args = array ('name' => __ ('Prodotti', 'tutsplus'), 'singular_name' => __ ('Prodotto', 'tutsplus')); register_post_type ('product', $ args);
Il valore che usi per post_type
argomento durante la richiesta di prodotti non lo è 'Prodotto'
o 'Prodotti'
ma 'Prodotto'
:
$ args = array ('post_type' => 'prodotto');
Per impostazione predefinita, se si tenta di eseguire una query per gli allegati non funzionerà, come WordPress imposta il post_status
di allegati a ereditare
e WP_Query
predefinito 'post_status' => 'pubblica'
a meno che non si specifichi diversamente. Quindi se vuoi richiedere gli allegati dovere includere il post_status
discussione:
$ args = array ('post_type' => 'attachment', 'post_status' => 'inherit');
Nota che potresti anche usare qualunque
invece di ereditare
.
utilizzando WP_Query
creare query personalizzate per post e post tipi è qualcosa che faccio molto. Come hai visto dagli esempi qui, ci sono molte possibilità:
Ci sono molte più possibilità usando gli argomenti trattati qui, ma questo dovrebbe darti un assaggio.