Quando si dovrebbe usare WP_Query vs query_posts () vs get_posts ()?
-
16-10-2019 - |
Domanda
Sembra che la metà dei tutorial nel Codex e intorno all'uso blogosfera query_posts()
e mezzo uso WP_Query
. Qual è il problema?
Soluzione
-
query_posts()
è eccessivamente semplicistico e un modo problematico per modificare la query principale di un pagina sostituendola con nuova istanza della query. E 'inefficiente (repliche SQL query) e sarà a titolo definitivo non riuscire in alcune circostanze (in particolare spesso quando si tratta di messaggi impaginazione). Qualsiasi codice WP moderna dovrebbe usare metodi più affidabili, come fare uso delpre_get_posts
gancio, per questo scopo. TL;. DR non utilizzare query_posts () mai -
get_posts()
è molto simile in uso e accetta gli stessi argomenti (con alcune sfumature , come differenti valori di default), ma restituisce un array di tutti i messaggi, non modifica le variabili globali ed è sicuro da usare ovunque. -
WP_Query
è la classe che alimenta sia dietro le quinte, ma è anche possibile creare e lavorare con la propria istanza di esso. Un po 'più complessa, meno restrizioni, anche sicuro da usare ovunque.
Altri suggerimenti
query_posts
- Non si dovrebbe mai usare mai query_posts
. A parte quanto @Rarst ha detto, il problema veramente grande con query_posts
è, si rompe l'oggetto query principale (memorizzato in $wp_query
). Un sacco di plugin e codice personalizzato si basa sull'oggetto query principale, in modo da rompere il principale mezzo di oggetti query che si sta rompendo la funzionalità di plugin e codice personalizzato. Solo una tale funzione è l'importante funzione di tutto l'impaginazione, quindi se si interrompe la query principale, si interrompe l'impaginazione.
Per dimostrare quanto male query_posts
è, su qualsiasi modello, effettuare le seguenti operazioni e confronta i risultati
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_posts
e WP_Query
sono il modo corretto di costrutto secondarie query ( come related posts, cursori, contenuti in primo piano e contenuti su pagine statiche ) con. Va notato, non si dovrebbe usare una delle due a favore della query principale sulla home page, pagina singola o qualsiasi tipo di pagina di archivio come si romperà la funzionalità pagina. Se è necessario modificare la query principale, utilizzare pre_get_posts
a farlo, e non una query personalizzata. ( UPDATE: Per prime pagine statiche e veri pagine, vedere Utilizzando pre_get_posts su vere pagine e pagine statiche *)
In sostanza, WP_Query
viene utilizzato dalla query principale ed è utilizzato anche da get_posts
, ma anche se get_posts()
utilizza WP_Query
, ci sono alcune differenze
-
get_posts
sono più veloci diWP_Query
. Il margine dipende dalla quantità dei messaggi totali del sito. La ragione di questo è,get_posts
passa'no_found_rows' => true
per impostazione predefinita perWP_Query
che salta / rompe legalmente impaginazione. Con'no_found_rows' => true
,WP_Query
ottiene la quantità di messaggi interrogati, poi balle fuori, dove per impostazione predefinita, ulteriore ricerca per tutti i messaggi che corrispondono alla query al fine di calcolare l'impaginazione.Per questo motivo,
get_posts()
dovrebbe essere utilizzato solo per le query non impaginati. Impaginareget_posts
è davvero una grande confusione.WP_Query
deve essere utilizzato per tutti i impaginato query -
get_posts()
non sono influenzati dai filtriposts_*
doveWP_Query
viene influenzata da questi filtri. La ragione è cheget_posts
, per impostazione predefinita, passa'suppress_filters' => true
aWP_Query
-
get_posts
ha un paio di parametri extra comeinclude
,exclude
,numberposts
ecategory
. Questi parametri non vengono cambiati in parametri validi perWP_Query
prima di essere passato aWP_Query
.include
viene cambiato inpost__in
,exclude
inpost__not_in
,category
incat
enumberposts
inposts_per_page
. Solo una nota, tutti dei parametri che possono essere passati alle opereWP_Query
conget_posts
, è possono ignorare e non utilizzare i parametri di default delget_posts
-
get_posts
restituisce solo la proprietà$posts
diWP_Query
mentreWP_Query
restituisce l'oggetto completo. Questo oggetto è molto utile quando si tratta di condizionali, impaginazione e altre informazioni utili che possono essere utilizzati all'interno del ciclo. -
get_posts
non utilizza il ciclo, ma un cicloforeach
ai post di visualizzazione. Inoltre, nessun tag template sono disponibili per impostazione predefinita.setup_postdata( $post )
deve essere utilizzato per rendere i tag modello disponibili.WP_Query
utilizza i tag di loop e dei modelli sono disponibili per impostazione predefinita ??p> -
get_posts
passa'ignore_sticky_posts' => 1
aWP_Query
, cosìget_posts
di defaultignora le messaggi appiccicosi
In base a quanto sopra, se utilizzare o get_posts
WP_Query
sta a voi e che cosa hai veramente bisogno dalla query. Quanto sopra dovrebbe guidare l'utente nella scelta ??p>
La differenza fondamentale è che query_posts()
è in realtà solo per modificare la corrente Loop. Una volta che hai finito è necessario resettare il ciclo e inviarlo per la sua strada. Questo metodo è anche un po 'più facile da capire, semplicemente perché il vostro "query" è fondamentalmente una stringa URL che si passa alla funzione, in questo modo:
query_posts('meta_key=color&meta_value=blue');
D'altra parte, WP_Query
è più di uno strumento di uso generale, ed è più simile scrivendo direttamente query MySQL di query_posts()
è. È inoltre possibile utilizzare ovunque (non solo nel Loop) e non interferisce con nessun momento l'esecuzione di query pubblicare.
Io tendo ad usare WP_Query
più spesso, come accade. In realtà, sta andando a venire giù al vostro caso specifico.
Semplicemente non c'è alcuna necessità di utilizzare query_posts()
. Tutto ciò che fa è un'istanza di un nuovo oggetto WP_Query e assegna nuovamente il nuovo oggetto a global wp_query
.
Per riferimento, la seguente è quella funzione effettiva query_posts()
.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
un'istanza per il proprio oggetto WP_Query se si desidera creare una profonda script di query personalizzati. O l'uso get_posts()
, se tutto quello che dovete fare è qualche manipolazione di luce qua e là.
In ogni caso, consiglio vivamente di fare un favore e andare a wp_includes/query.php
e sfogliando la classe WP_Query
.
Assicurarsi di utilizzare wp_reset_query()
dopo l'uso query_posts()
perché influenzerà altro risultato della query anche.
Se Ricordo di aver letto bene, in sostanza, "il cerchio" sta facendo WP_Query
nei file core, ma in un modo facile da capire.
- query_posts () : potrebbe essere utilizzato in uno e unico caso se è necessario modificare principale query. Esso definisce un sacco di variabili globali;
- get_posts () : è molto simile nella meccanica e accetta stessi argomenti, ma ritorna matrice di tutti i messaggi
- WP_Query : è possibile creare e lavorare con il proprio oggetto di esso. Po 'più complessa, meno restrizioni, è sicuro da usare ovunque.
direi non utilizzare get_posts()
in un plugin. Essa impone filtri molto restrittive in alcuni casi (suppress_filters
di serie, ignore_sticky_posts
, ecc) e dovrebbe probabilmente essere usato solo in un tema quando si desidera qualcosa di fatto veloce.