Sembra che metà dei tutorial nel Codex e intorno all'uso della blogosfera query_posts()
e metà uso WP_Query
. Qual è l'accordo?
Sembra che metà dei tutorial nel Codex e intorno all'uso della blogosfera query_posts()
e metà uso WP_Query
. Qual è l'accordo?
Risposte:
query_posts()
è eccessivamente semplicistico e un modo problematico per modificare la query principale di una pagina sostituendola con una nuova istanza della query. È inefficiente (esegue nuovamente le query SQL) e fallirà completamente in alcune circostanze (soprattutto quando si ha a che fare con l'impaginazione dei post). Qualsiasi codice WP moderno dovrebbe utilizzare metodi più affidabili, come l'uso pre_get_posts
dell'hook, per questo scopo. TL; DR non usa mai query_posts () .
get_posts()
è molto simile nell'uso e accetta gli stessi argomenti (con alcune sfumature, come impostazioni predefinite diverse), ma restituisce una serie di post, non modifica le variabili globali ed è sicuro da usare ovunque.
WP_Query
è la classe che alimenta entrambi dietro le quinte, ma puoi anche creare e lavorare con la tua propria istanza. Un po 'più complesso, meno restrizioni, sicuro da usare ovunque.
query_posts()
è una piccola funzione wrapper per WP_Query
, l'unica cosa extra che fa (come da diagramma di flusso) è la sovrascrittura globale$wp_query
query_posts()
con WP_Query
non farà alcuna differenza nelle prestazioni, la query della pagina originale verrà comunque eseguita perché fa parte del carico principale. Queste query verranno eseguite anche se il file modello non ha alcun ciclo.
query_posts
non modificare il ciclo principale a tutti, sostituisce esso dopo aver già eseguito. Il modo migliore per modificare il ciclo principale è attraverso un pre_get_posts
filtro. developer.wordpress.com/2012/05/14/…
query_posts
- Non dovresti mai usare query_posts
. A parte ciò che ha detto @Rarst, il vero problema query_posts
è che rompe l'oggetto di query principale (archiviato in $wp_query
). Molti plug-in e codice personalizzato si basano sull'oggetto query principale, quindi la rottura dell'oggetto query principale significa che si stanno rompendo le funzionalità dei plug-in e del codice personalizzato. Solo una di queste funzioni è l'importante funzione di impaginazione, quindi se si interrompe la query principale, si interrompe l'impaginazione.
Per dimostrare quanto query_posts
è male , su qualsiasi modello, fai quanto segue 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 costruire query secondarie ( come post correlati, cursori, contenuti in primo piano e contenuti su prime pagine statiche ) con. Va notato che non dovresti usare nessuno dei due a favore della query principale sulla home page, sulla singola pagina o su qualsiasi tipo di pagina di archivio poiché interromperà la funzionalità della pagina. Se è necessario modificare la query principale, utilizzare pre_get_posts
per farlo e non una query personalizzata. ( AGGIORNAMENTO: per le prime pagine statiche e le vere pagine, vedere Utilizzo di pre_get_posts su pagine vere e prime pagine statiche *)
In sostanza, WP_Query
viene utilizzato dalla query principale e viene utilizzato anche da get_posts
, ma sebbene get_posts()
utilizzi WP_Query
, ci sono alcune differenze
get_posts
sono più veloci di WP_Query
. Il margine dipende dalla quantità di post totali del sito. Il motivo di ciò è, get_posts
passa 'no_found_rows' => true
di default a WP_Query
cui salta / interrompe legalmente l'impaginazione. Con 'no_found_rows' => true
, WP_Query
ottiene la quantità di post richiesti, quindi esce, dove per impostazione predefinita, cerca ulteriormente tutti i post corrispondenti alla query per calcolare l'impaginazione.
Per questo motivo, get_posts()
deve essere utilizzato solo per query non impaginate. La paginazione get_posts
è davvero un gran casino. WP_Query
dovrebbe essere usato per tutte le query impaginate
get_posts()
non sono influenzati dai posts_*
filtri dove WP_Query
vengono influenzati da questi filtri. Il motivo è che get_posts
, per impostazione predefinita, passa 'suppress_filters' => true
aWP_Query
get_posts
ha un paio di parametri extra come include
, exclude
, numberposts
e category
. Questi parametri vengono modificati in parametri validi WP_Query
prima di essere passati a WP_Query
. include
viene cambiato in post__in
, exclude
in post__not_in
, category
in cat
e numberposts
in posts_per_page
. Solo una nota, tutti i parametri che possono essere passati a WP_Query
lavorare con get_posts
, è possibile ignorare e non utilizzare i parametri predefiniti diget_posts
get_posts
restituisce solo la $posts
proprietà di WP_Query
while WP_Query
restituisce l'oggetto completo. Questo oggetto è abbastanza utile quando si tratta di condizionali, impaginazione e altre informazioni utili che possono essere utilizzate all'interno del ciclo.
get_posts
non utilizza il loop, ma un foreach
loop per visualizzare i post. Inoltre, per impostazione predefinita non sono disponibili tag modello. setup_postdata( $post )
deve essere utilizzato per rendere disponibili i tag modello. WP_Query
utilizza il ciclo e i tag modello sono disponibili per impostazione predefinita
get_posts
passa 'ignore_sticky_posts' => 1
a WP_Query
, quindi get_posts
per impostazione predefinita ignora i post appiccicosi
Sulla base di quanto sopra, se utilizzare get_posts
o WP_Query
dipende da te e cosa hai effettivamente bisogno dalla query. Quanto sopra dovrebbe guidarti nella tua scelta
La differenza di base è che in query_posts()
realtà è solo per modificare il loop corrente. Una volta terminato, è necessario ripristinare il loop e inviarlo nel modo giusto. Questo metodo è anche un po 'più semplice da capire, semplicemente perché la tua "query" è fondamentalmente una stringa URL che passi alla funzione, in questo modo:
query_posts('meta_key=color&meta_value=blue');
D'altra parte, WP_Query
è più uno strumento generico, ed è più come scrivere direttamente query MySQL di quanto non query_posts()
sia. Puoi anche usarlo ovunque (non solo nel Loop) e non interferisce con nessuna post query attualmente in esecuzione.
Tendo a usarlo WP_Query
più spesso, come succede. Davvero, si ridurrà al tuo caso specifico.
Semplicemente non è necessario utilizzare query_posts()
. Tutto ciò che fa è creare un'istanza di un nuovo oggetto WP_Query e riassegnare quel nuovo oggetto a global wp_query
.
Per riferimento, la seguente è quella query_posts()
funzione effettiva .
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Crea un'istanza del tuo oggetto WP_Query se desideri creare uno script di query personalizzato approfondito. Oppure usa get_posts()
se tutto ciò che devi fare è qualche manipolazione leggera qua e là.
In entrambi i casi, consiglio vivamente di farti un favore e di andare a wp_includes/query.php
leggere la WP_Query
lezione.
Assicurarsi di utilizzare wp_reset_query()
dopo l'uso query_posts()
perché influirà anche sul risultato di altre query.