Domanda

Sembra che la metà dei tutorial nel Codex e intorno all'uso blogosfera query_posts() e mezzo uso WP_Query . Qual è il problema?

È stato utile?

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 del pre_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 di WP_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 per WP_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. Impaginare get_posts è davvero una grande confusione. WP_Query deve essere utilizzato per tutti i impaginato query

  • get_posts() non sono influenzati dai filtri posts_* dove WP_Query viene influenzata da questi filtri. La ragione è che get_posts, per impostazione predefinita, passa 'suppress_filters' => true a WP_Query

  • get_posts ha un paio di parametri extra come include, exclude, numberposts e category. Questi parametri non vengono cambiati in parametri validi per WP_Query prima di essere passato 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 dei parametri che possono essere passati alle opere WP_Query con get_posts, è possono ignorare e non utilizzare i parametri di default del get_posts

  • get_posts restituisce solo la proprietà $posts di WP_Query mentre WP_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 ciclo foreach 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

  • get_posts passa 'ignore_sticky_posts' => 1 a WP_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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a wordpress.stackexchange
scroll top