Argomenti WP_Query post, pagine e tipi di post

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.

Un riassunto su come gli argomenti funzionano in 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:

  • gli argomenti per la query, usando i parametri che saranno trattati in questo tutorial
  • la query stessa
  • il cappio
  • terminare: chiudere se e mentre tag e reimpostare i dati

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.

Coding Your Arguments

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.

Interrogazione per singoli post o pagine

Iniziamo con lo scenario più semplice: eseguire una query per trovare un post o una pagina specifici.

Interrogare per un post

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.

Interrogare per una pagina

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');

Interrogazione per un post di un altro tipo

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');

Interrogazione per le pagine secondarie

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'));

Interrogazione per più post

È 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.

Interrogazione per tipi di post

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.
  • Tipi di messaggi personalizzati (ad es. 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');

Tipi di messaggi personalizzati

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');

allegati

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.

Sommario

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à:

  • Usalo per richiedere le pagine di primo livello nel tuo sito.
  • Usalo per interrogare per post di uno specifico tipo di post.
  • Usalo per interrogare tutti i messaggi tranne quelli specificati.
  • Usalo per interrogare tutti i bambini della pagina corrente.

Ci sono molte più possibilità usando gli argomenti trattati qui, ma questo dovrebbe darti un assaggio.