Quando dovresti usare WP_Query vs query_posts () vs get_posts ()?
-
-
Controlla anche questa [analisipiù lunga] (http://wordpress.stackexchange.com/questions/226960/why-query-posts-isnt-marked-as-deprecated/248955#248955)Check also this [longer analysis](http://wordpress.stackexchange.com/questions/226960/why-query-posts-isnt-marked-as-deprecated/248955#248955)
- 1
- 2016-12-25
- prosti
-
7 risposta
- voti
-
- 2010-09-13
-
query_posts()
èeccessivamente semplicisticoe modoproblematicopermodificare la queryprincipale di unapagina sostituendola con unanuovaistanza della query. Èinefficiente (eseguenuovamente le query SQL)e in alcune circostanzefallirà completamente (specialmente spesso quando sitratta diimpaginazione deipost). Qualsiasi codice WPmoderno dovrebbe utilizzaremetodipiù affidabili,come l'utilizzo dipre_get_posts
hook,per questo scopo. TL; DR non utilizzaremai query_posts () . -
get_posts()
èmolto similenell'utilizzoe accettagli stessi argomenti (con alcune sfumature,come valoripredefiniti diversi),ma restituisce un array dipost,nonmodifica le variabiliglobalied è sicuro da usare ovunque. -
WP_Query
è la classe che alimentaentrambi le scene,mapuoi anche crearee lavorare con latuaistanza. Unpo 'più complesso,meno restrizioni,anche sicuro da usare ovunque.
query_posts()
is overly simplistic and a problematic way to modify the main query of a page by replacing it with new instance of the query. It is inefficient (re-runs SQL queries) and will outright fail in some circumstances (especially often when dealing with posts pagination). Any modern WP code should use more reliable methods, like making use of thepre_get_posts
hook, for this purpose. TL;DR don't use query_posts() ever.get_posts()
is very similar in usage and accepts the same arguments (with some nuances, like different defaults), but returns an array of posts, doesn't modify global variables and is safe to use anywhere.WP_Query
is the class that powers both behind the scenes, but you can also create and work with your own instance of it. A bit more complex, fewer restrictions, also safe to use anywhere.
-
(1) "ed è sicuro da usare ovunque" ->manon usarloperil ciclo MAIN.(2) ricordarsi di usare $ query_stringglobale;prima della riga che ha query_posts ();(1) "and is safe to use anywhere" --> but do not use this for the MAIN loop. (2) remember to use global $query_string; before the line that has query_posts();
- 1
- 2011-02-19
- edelwater
-
@scribupoi dinuovo 'get_posts'funzionerà anche senon consigliato: http://core.trac.wordpress.org/ticket/16545@scribu then again 'get_posts' will work although not advised: http://core.trac.wordpress.org/ticket/16545
- 1
- 2011-02-19
- edelwater
-
Credo che `query_posts` sia anchemenoefficientein quantoeseguirà query aggiuntive,quando se usi solo` WP_Query`periltuo cicloprincipale,eseguirà solo la query che scegliin WP_Query.I believe that `query_posts` is also less efficient in that it will run additional queries, when if you use only `WP_Query` for your main loop, it will only run the query you choose in WP_Query.
- 1
- 2011-08-08
- jjeaton
-
@jjeaton `query_posts ()` è unapiccolafunzione wrapperper `WP_Query`,l'unica cosaextra chefa (come da diagramma diflusso) è la sovrascritturaglobale di` $ wp_query`@jjeaton `query_posts()` is tiny wrapper function for `WP_Query`, the only extra thing it does (as per flowchart) is overwriting global `$wp_query`
- 10
- 2011-08-08
- Rarst
-
@ Rarstmi riferivo a [questa sezione del Codexper query_posts] (http://codex.wordpress.org/Function_Reference/query_posts#Additional_SQL_Queries)tuttavia,potrei sbagliarmi riguardo all'effetto sulleprestazioni.Ameno che l'utilizzo di WP_Queryneltuofilemodellonon abbia lo stesso risultato (ovverobuttare via la querye rieseguirla)@Rarst I was referring to [this section in the Codex for query_posts](http://codex.wordpress.org/Function_Reference/query_posts#Additional_SQL_Queries) however, I may be mistaken regarding the effect on performance. Unless using WP_Query in your template file will also have the same result (i.e. throwing away your query, and re-executing)
- 1
- 2011-08-08
- jjeaton
-
@jjeaton Sostituire `query_posts ()` con `WP_Query`nonfarà alcuna differenzain termini diprestazioni,la query dellapagina originale continuerà aessereeseguitaperchéfaparte del caricoprincipale.Queste query verrannoeseguite anche seilfilemodellonon ha alcun ciclo.@jjeaton Replacing `query_posts()` with `WP_Query` will make no difference in performance, original page's query will still run because that is part of core load. Those queries will run even if your template file has no loop at all.
- 9
- 2011-08-08
- Rarst
-
Non riesco a sbarazzarmi della sensazione che questo siailpostpiùgenialee votato su WPSE.Dovrebbeessere anchenel Codex.Can't get rid off the feeling that this the most genious and upvoted post on WPSE. Should be in Codex as well.
- 122
- 2011-09-16
- kaiser
-
Ok,dopo averloguardatoperpiù di unpo 'ditempo,penso che a `query_posts ()`manchi una var statica che vieneimpostata sutrue dopoilprimo utilizzoe,se usato due volte,dovrebbe attivare `_doing_it_wrong ();`.Immagino che stoperinfastidireil wp-hacker oiltracper questo.Ok, after looking at it for more than quite a time, I think `query_posts()` is missing a static var that get's set to true after the first use and - if used twice - should trigger `_doing_it_wrong();`. Guess I'm going to bug the wp-hacker or trac guys about this.
- 1
- 2011-09-16
- kaiser
-
@kaiserbeh ... usare `query_posts ()` due volte èpessimo come una volta,nonimportamolto comeperme.:)btw Andrew Nacinfarà unapresentazione sulle domandee ha detto chepotrebbeproporre alcunimiglioramenti al diagramma diflusso,quindi la versione duepotrebbe arrivarein futuro.@kaiser well... using `query_posts()` twice is about as bad as once, doesn't matter much as for me. :) btw Andrew Nacin is going to do presentation on queries and he said he might propose some improvements to the flowchart, so version two might be coming some time in the future.
- 1
- 2011-09-16
- Rarst
-
Aggiungerò solo lamia descrizionepiù chiara delproblema "prestazioni di query_posts ()": l'utilizzo di query_posts () o WP_Query all'interno di unfilemodello avrà lo stesso costo diesecuzione: la query appenaeseguita.Ilproblema discussonell'articolo del codice è che se vuoieffettivamente sostituire la query dovrestifarlofiltrando la query_posts () originale conilfiltro 'parse_query'.In questomodo hai solo una query originalee desiderabile,invece dieseguire una seconda queryper sostituirlagoffamente.query_posts () NON È MAI IL MODO !!MAI!I'll just add my clearest description of the "performance of query_posts()" issue: Using query_posts() or WP_Query within a template file will have the same performnace cost: the query you just performed. The issue discussed in the codex article is that if you actually want to replace the query you should do so by filtering the original query_posts() with the 'parse_query' filter. That way you only have the one, original, desirable query, rather than doing a second query to awkwardly replace it. query_posts() is NEVER THE WAY!! NEVER!
- 9
- 2012-04-19
- jerclarke
-
Questononfamenzione delfiltro "richiesta",che è un ottimomodopermodificare la queryprincipale.Il vantaggio rispetto a query_posts è che lafunzione cancella la query originalee negenera unanuova,come se si usasse WP_Query.Utilizzandoilfiltro di richiesta,modifichi la query originaleprima che vengainviata.Penso che questo sia ciò che @JeremyClarke sta ottenendo sopra.This makes no mention of the 'request' filter, which is a great way to modify the main query. The advantage over query_posts is that function wipes out the original query and generates a new one - same as if you used WP_Query. By using the request filter, your modifying the original query before its ever sent. I think thats what @JeremyClarke is getting at above.
- 1
- 2012-05-02
- eddiemoya
-
C'è un'incredibile spiegazione di query_posts scritta da John James Jacoby sulblog developer.wordpress.com chefa saltaretutte queste rispostefuori dall'acqua.Ilpuntoprincipale: `query_posts`non *modifica * affattoil cicloprincipale,* lo sostituisce * * dopo * che ègià statoeseguito.Ilmodomigliorepermodificareil cicloprincipale è attraverso unfiltro `pre_get_posts`. http://developer.wordpress.com/2012/05/14/querying-posts-without-query_posts/There's a freaking awesome explanation of query_posts written by John James Jacoby on the developer.wordpress.com blog that blows all of these answers out of the water. The main point: `query_posts` doesn't *modify* the main loop at all, it *replaces* it *after* it has already run. The best way to modify the main loop is through a `pre_get_posts` filter. http://developer.wordpress.com/2012/05/14/querying-posts-without-query_posts/
- 23
- 2012-06-09
- Dan Gayle
-
@ Dan stai confondendoimplementazionetecnicae scopo.`query_posts ()` sostituisce l'oggetto del cicloprincipale,ma lo scopo èmodificareil cicloprincipale.Inoltremi piaccionomoltoi filtri di loop,manonera quella la domandaposta.C'è una domanda difollow-up da un'altrapersona su quell'argomento.@Dan you are confusing technical implementation and purpose. `query_posts()` does replace main loop object, but the purpose of it is to modify main loop. Also I am warmly fond of loop filters, but that wasn't what question asked. There is follow up question from other person on that topic.
- 3
- 2012-06-10
- Rarst
-
La domandaera "Quando dovresti usare ... query_posts ()"e secondo la logicapresentata da quelpost sulbloge dai commenti sopra,la rispostaprobabilmentenon èmai.The question was "When should you use... query_posts()" and according to the logic presented by that blog post and the comments above, the answer is likely never.
- 2
- 2012-06-11
- Dan Gayle
-
quindi,se è cosìbrutto,perchéesiste `query_posts`?so, if its so bad, why does `query_posts` exist?
- 2
- 2012-09-10
- Manny Fleurmond
-
@Manny Fleurmond concettualmente `query_posts ()` è untentativo di ridurrei concetti del cicloprincipale al livello deltagtemplate deltema (lafacilità di cui è uno deipunti diforza dellapopolarità di WP).L'attività si è semplicemente rivelatatroppoimpegnativaperpoteressereeseguita da untagtemplate.Gli sviluppatoriprincipali hannoespresso lapossibilità che diventasse deprecato,manon credo che ci sia stata ancora una decisione al riguardo.@Manny Fleurmond conceptually `query_posts()` is an attempt to dumb down main loop concepts to the level of theme template tag (ease of which is one of the strong points for WP popularity). The task simply turned out to be too much for template tag to possibly accomplish. Core developers did voice possibility of it getting deprecated but I don't think there was decision about that yet.
- 1
- 2012-09-10
- Rarst
-
In realtànonpuoi "usare ovunque" WP_Query (),ho appenaprovatoe continua agracchiare su $thequery-> have_posts (),ricorsioneinfinita,vedi http://wordpress.stackexchange.com/questions/34270You actually can't "use anywhere" the WP_Query(), i just tried and it still croaks at $thequery->have_posts(), infinite recursion, see http://wordpress.stackexchange.com/questions/34270
- 1
- 2014-10-21
- NoBugs
-
@NoBugsil cicloin quella domanda è sbagliatoe c'è una risposta che spiegaperché.@NoBugs the loop in that question is wrong and there is answer explaining why.
- 1
- 2014-10-21
- Rarst
-
Grazie Agghhper questo.Infine,qualcosa ha un senso.Seriamente,WordPresse la loropessima documentazione.Non so come un software così complessoe standard di codifica scadenti siano diventati cosìpopolari.Agghh thanks for this. Finally, something makes sense. Seriously, WordPress and their lousy documentation. I don't know how such convoluted software and bad coding standards became so popular.
- 1
- 2015-04-16
- racl101
-
Trovato questotest di velocitàtra wp_querye get_posts http://www.wpclocked.com/Found this speed test between wp_query and get_posts http://www.wpclocked.com/
- 1
- 2015-07-18
- Anagio
-
Mifiderei ditaletest ...esattamentenessuno.:) Lafunzione è un _molto_involucro sottile,qualsiasi differenza deriverà da una leggera differenzanegli argomentie/onegli hook.I would trust such test... exactly none. :) The function is a _very_ thin wrapper, any difference will be coming from slight difference in arguments and/or hooks.
- 1
- 2015-07-19
- Rarst
-
Non c'èbisogno diemozioni,query_posts () è unafunzione coneffetti collaterali: l'impostazione di unglobale.WordPress è sconcertato confunzioni coneffetti collaterali.Non sitratta di unproblema diprestazionima di unproblema di qualità del codice.Guarda https://developer.wordpress.org/reference/functions/query_posts/e guarda cosafa query_posts.Usa WP_Query ameno chetunon voglia confondere le variabiliglobali.No need for emotions, query_posts() is a function with side effects: setting a global. WordPress is staggerd with functions with side effects. This is not a performance issue but a quality of code issue. Look at https://developer.wordpress.org/reference/functions/query_posts/ and see what query_posts does. Use WP_Query unless you want to mess up global variables.
- 0
- 2020-03-14
- user718960
-
- 2015-06-18
query_posts
- Non dovrestimai usarequery_posts
. Aparte ciò che ha detto @Rarst,ilgrossoproblema conquery_posts
è che rompe l'oggetto queryprincipale (memorizzatoin$ wp_query
). Moltiplug-ine codicepersonalizzato sibasano sull'oggetto queryprincipale,quindi rompere l'oggetto queryprincipale significainterrompere lefunzionalità deiplug-ine del codicepersonalizzato. Solo una di questefunzioni è lapiùimportantefunzione diimpaginazione,quindi seinterrompi la queryprincipale,interrompi l'impaginazione.Per dimostrare quanto siapessimo
query_posts
,su qualsiasimodello,procedi come seguee confrontai risultativar_dump ($ wp_query); query_posts ('& amp;posts_per_page=-1'); var_dump ($ wp_query);
get_posts
eWP_Query
sonoilmodo correttoper costruire query secondarie ( comepost correlati,cursori,contenutiin primopianoe contenuti sulleprimepagine statiche) con. Vanotato,non dovresti usarenessuno dei due afavore della queryprincipale sulla homepage,sulla singolapagina o su qualsiasitipo dipagina di archivioin quantointerromperà lafunzionalità dellapagina. Se ènecessariomodificare la queryprincipale,utilizzarepre_get_posts
perfarloe non una querypersonalizzata. ( AGGIORNAMENTO: per leprimepagine statichee lepagine reali,vedere Utilizzo dipre_get_posts supagine veree primepagine statiche *)In sostanza,
WP_Query
viene utilizzato dalla queryprincipaleed è anche utilizzato daget_posts
,ma sebbeneget_posts ()
utilizziWP_Query
,ci sono alcune differenzeget_posts
sonopiù veloci diWP_Query
. Ilmargine dipende dalla quantità diposttotali del sito. Ilmotivo è cheget_posts
passa'no_found_rows'=>true
perimpostazionepredefinita aWP_Query
che salta/interrompe legalmente l'impaginazione. Con'no_found_rows'=>true
,WP_Query
ottiene la quantità dipostinterrogati,quindi saltafuori,doveperimpostazionepredefinita,cerca ulteriormentetuttii post che corrispondono alla queryper calcolare l'impaginazione.Per questomotivo,
get_posts ()
dovrebbeessere utilizzato soloper querynonimpaginate. Impaginareget_posts
è davvero ungran casino.WP_Query
dovrebbeessere utilizzatopertutte le queryimpaginateget_posts ()
non èinfluenzato daifiltriposts_ *
doveWP_Query
vieneinfluenzato da questifiltri. Ilmotivo è cheget_posts
,perimpostazionepredefinita,passa'suppress_filters'=>true
aWP_Query
get_posts
ha unpaio diparametriextra comeinclude
,exclude
,numberposts
ecategoria
. Questiparametri vengonomodificatiin parametri validiperWP_Query
prima diesserepassati aWP_Query
.include
vienemodificatoinpost__in
,exclude
inpost__not_in
,category
incat
enumberposts
inposts_per_page
. Solo unanota,tutti i parametri chepossonoesserepassati aWP_Query
funziona conget_posts
,puoi ignoraree non utilizzarei parametripredefiniti diget_posts
get_posts
restituisce solo laproprietà$posts
diWP_Query
mentreWP_Query
restituisce l'oggetto completo. Questo oggetto èmolto utile quando sitratta di condizionali,impaginazionee altreinformazioni utili chepossonoessere utilizzate all'interno del ciclo.get_posts
non utilizzail ciclo,ma un cicloforeach
per visualizzarei post. Inoltre,nessuntag delmodello è disponibileperimpostazionepredefinita.setup_postdata ($post)
deveessere utilizzatoper rendere disponibilii tag delmodello.WP_Query
utilizzail cicloe itag delmodello sono disponibiliperimpostazionepredefinitaget_posts
supera'ignore_sticky_posts'=> 1
aWP_Query
,quindiget_posts
ignoraperimpostazionepredefinitai postpersistenti
Inbase a quanto sopra,se utilizzare
get_posts
oWP_Query
dipende date e di cosa haieffettivamentebisogno dalla query. Quanto sopra dovrebbeguidartinellatua sceltaquery_posts
- You should never ever usequery_posts
. Apart from what @Rarst has said, the really big issue withquery_posts
is, it breaks the main query object ( stored in$wp_query
). A lot of plugins and custom code relies on the main query object, so breaking the main query object means that you are breaking the functionalities of plugins and custom code. Just one such function is the all important pagination function, so if you break the main query, you break pagination.To prove how bad
query_posts
is, on any template, do the following and compare the resultsvar_dump( $wp_query ); query_posts( '&posts_per_page=-1' ); var_dump( $wp_query );
get_posts
andWP_Query
are the correct way to construct secondary queries ( like related posts, sliders, featured contentand content on static front pages) with. It should be noted, you should not use any of the two in favor of the main query on the home page, single page or any type of archive page as it will break page functionality. If you need to modify the main query, usepre_get_posts
to do so, and not a custom query. (UPDATE: For static front pages and true pages, see Using pre_get_posts on true pages and static front pages*)In essence,
WP_Query
is used by the main query and is also used byget_posts
, but althoughget_posts()
usesWP_Query
, there are a few differencesget_posts
are faster thanWP_Query
. The margin depends on the amount of total posts of the site. The reason for this is,get_posts
passes'no_found_rows' => true
by default toWP_Query
which skips/legally breaks pagination. With'no_found_rows' => true
,WP_Query
gets the amount of posts queried, then bails out, where by default, it further search for all posts matching the query in order to calculate pagination.For this reason,
get_posts()
should be used for non paginated queries only. Paginatingget_posts
is really one big mess.WP_Query
should be used for all paginated queriesget_posts()
aren't influenced by theposts_*
filters whereWP_Query
gets influenced by these filters. The reason is thatget_posts
, by default, passes'suppress_filters' => true
toWP_Query
get_posts
has a couple of extra parameters likeinclude
,exclude
,numberposts
andcategory
. These parameters do get changed into valid parameters forWP_Query
before being passed toWP_Query
.include
gets changed intopost__in
,exclude
intopost__not_in
,category
intocat
andnumberposts
intoposts_per_page
. Just a note, all of the parameters that can be passed toWP_Query
works withget_posts
, you can ignore and not use the default parameters ofget_posts
get_posts
returns just the$posts
property ofWP_Query
whileWP_Query
returns the complete object. This object is quite useful when it comes to conditionals, pagination and other useful info that can be used inside the loop.get_posts
doesn't use the loop, but aforeach
loop to display posts. Also, no template tags are available by default.setup_postdata( $post )
has to be used to make the template tags available.WP_Query
uses the loop and template tags are available by defaultget_posts
passes'ignore_sticky_posts' => 1
toWP_Query
, soget_posts
by default ignores sticky posts
Based on the above, whether to use
get_posts
orWP_Query
is up to you and what do you actually need from the query. The above should guide you in your choice-
Vorreipoter rispostepreferite.Questo spiega cosìtanto.I wish I could favorite answers. This explains so much.
- 2
- 2017-06-12
- Athoxx
-
Grande spiegazione! "get_posts () dovrebbeessere usato soloper querynonimpaginate. Impaginareget_posts è davvero ungran casino. WP_Query dovrebbeessere usatopertutte le queryimpaginate" Èfondamentalmentetutto ciò che qualcuno deve sapereimo.Great Explanation! "get_posts() should be used for non paginated queries only. Paginating get_posts is really one big mess. WP_Query should be used for all paginated queries" Is basically all someone needs to know imo.
- 2
- 2018-04-19
- Bullyen
-
- 2010-09-13
La differenzafondamentale è che
query_posts()
serve solopermodificareil Loop corrente.Una voltaterminato,ènecessario reimpostareil cicloe inviarlo allegramente.Questometodo è anche unpo 'piùfacile da capire,semplicementeperché latua "query" èfondamentalmente una stringa URL chepassi allafunzione,in questomodo:query_posts('meta_key=color&meta_value=blue');
D'altraparte,
WP_Query
èpiù uno strumentogenericoed èpiù simile alla scrittura diretta di query MySQL rispetto aquery_posts()
.Puoi anche usarlo ovunque (non solonel Loop)e noninterferisce con le query dipost attualmentein esecuzione.Tendo a usare
WP_Query
più spesso,come succede.Veramente,dipenderà daltuo caso specifico.The basic difference is that
query_posts()
is really only for modifying the current Loop. Once you're done it's necessary to reset the loop and send it on its merry way. This method is also a little easier to understand, simply because your "query" is basically a URL string that you pass to the function, like so:query_posts('meta_key=color&meta_value=blue');
On the other hand,
WP_Query
is more of a general purpose tool, and is more like directly writing MySQL queries thanquery_posts()
is. You can also use it anywhere (not just in the Loop) and it doesn't interfere with any currently running post queries.I tend to use
WP_Query
more often, as it happens. Really, it's going to come down to your specific case. -
- 2013-07-13
Semplicementenon ènecessario utilizzare
query_posts()
.Tutto ciò chefa èistanziare unnuovo oggetto WP_Querye riassegnare quelnuovo oggetto aglobal wp_query
.Per riferimento,la seguente è lafunzione
query_posts()
effettiva.function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); }
Crea un'istanza deltuo oggetto WP_Query se desideri creare uno script di querypersonalizzato approfondito.Oppure usa
get_posts()
setutto ciò che devifare è qualche leggeramanipolazione quae là.Inentrambii casi,consiglio vivamente difarti unfavoree di andare su
wp_includes/query.php
e diesaminare attentamente la classeWP_Query
.There is simply no need to use
query_posts()
. All it does is instantiates a new WP_Query object and reassigns that new object toglobal wp_query
.For reference, the following is that actual
query_posts()
function.function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); }
Instantiate your own WP_Query object if you want to create an in depth custom query script. Or use
get_posts()
if all you need to do is some light manipulation here and there.In either case, I highly recommend doing yourself a favor and going to
wp_includes/query.php
and perusing theWP_Query
class. -
- 2013-07-08
Assicurati di utilizzare
wp_reset_query()
dopo aver utilizzatoquery_posts()
perchéinfluenzerà anche altri risultati della query.Make sure that you use
wp_reset_query()
after usingquery_posts()
because it will affect other query result also. -
-
- 2017-07-19
- query_posts () :potrebbeessere utilizzatoin un solo caso se ènecessariomodificarequery.Impostamolte variabiliglobali;
- get_posts () : èmolto similenellameccanicae accettagli stessi argomenti,ma restituisce un arraydipost
- WP_Query :puoi crearee lavorare coniltuo oggetto.Unpo 'più complesso,meno restrizioni,è sicuro da usare ovunque.
- query_posts(): might be used in one and only case if you need to modify main query . It sets a lot of global variables;
- get_posts(): it is very similar in mechanics and accepts same arguments, but returns array of posts
- WP_Query: you can create and work with own object of it. Bit more complex, less restrictions, it is safe to use anywhere.
Sembra chemetà deitutorialnel Codex e nellablogosfera utilizzino
query_posts()
e metà usanoWP_Query
.Qual èilproblema?