Quando você deve usar WP_Query vs Query_posts () vs get_posts ()?
-
-
Verifiquetambémesta [análisemais longa] (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 respostas
- votos
-
- 2010-09-13
-
query_posts()
éexcessivamente simplistae um Maneiraproblemática demodificar a consultaprincipal de umapágina,substituindo-apornovainstância da consulta. Éineficiente (re-executa consultas SQL)e iráfalharem algumas circunstâncias (especialmentefrequentemente ao lidar com apaginação dosposts). Qualquer código WPmoderno deve usarmétodosmais confiáveis,comofazer uso dopre_get_posts
Hook,paraestepropósito. Tl; dr não use very_posts ()nunca . -
get_posts()
émuito semelhanteno usoe aceita osmesmos argumentos (com algumasnuances,comopadrões diferentes),mas retorna umamatriz deposts,nãomodifica as variáveis globaise é seguro usarem qualquer lugar. -
WP_Query
A classe é a classe quetanto atrás As cenas,mas vocêtambémpode criare trabalhar com suaprópriainstância. Umpoucomais complexo,menos restrições,também seguropara usarem qualquer lugar.
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) "e é seguro usarem qualquer lugar" ->masnão useissopara o loopprincipal.(2) Lembre-se de usarglobal $ query_string;antes da linha quetenha consciência_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
-
@scribuentão,novamente 'get_posts' vaifuncionar,emboranão seja aconselhado: 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
-
Acredito que "Query_Posts"também émenoseficienteem queeleexecutará consultas adicionais,quando você usar apenas "WP_Query"para o seu loopprincipal,ele sóexecutará a consulta que vocêescolheráno 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 () 'é umapequenafunção wrapperpara` wp_query`,a única coisaextra queelefaz (conforme ofluxograma)está sobrescrevendo' $ 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
-
@Rarsteuestavame referindo a [esta seçãono Codexfor Query_Posts] (http://codex.wordpress.org/function_reference/query_posts#additional_sql_queries) Noentanto,possoestarenganadoem relação aoefeitono desempenho.Amenos que a utilização do WP_Queryno seu arquivo demodelotambémtenha omesmo resultado (i.e.jogandofora sua consultae re-execução)@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 Substituição `Query_Posts ()` com `WP_Query` Nãofará diferençano desempenho,a consulta dapágina original ainda seráexecutadaporqueissofazparte da carga donúcleo.Essas consultas serãoexecutadasmesmo se o arquivo demodelonãotivernenhum loop.@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
-
Não consigome livrar da sensação de queestemaisgênioe postagem upvotedno WPSE.Deveestarno codextambém.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,depois de olharparaissopormais de uma vez,acho que "Query_posts ()"estáfaltando um VARestáprontopara o TRUE após oprimeiro usoe - se usado duas vezes - deve acionar "_doing_it_wong ();"Acho que vouincomodar o WP-Hacker ou Trac Guys sobreisso.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
-
@kaier Bem ... usando `Query_Posts ()` duas vezes étão ruim quanto uma vez,nãoimportamuito quantoparamim.:) BTW Andrew Nacin vaifazer apresentaçãoem consultase ele disse quepoderiapropor algumasmelhoriasnofluxograma,então a versão doispodeestar chegando algumtemponofuturo.@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
-
Acrescentareiminha descriçãomais clara doproblema "Performance of Query_Posts ()": Usando Query_Posts () ou WP_Queryem um arquivo demodeloterá omesmo custo de desempenho: a consulta que você acabou deexecutar.Oproblema discutidono artigo do Codex é que,se você realmente quiser substituir a consulta,você devefazerissofiltrando o Query_Posts original () com ofiltro 'Parse_Query'.Dessaforma,você sótem a consulta única,originale desejável,em vez defazer uma segunda consultapara substituí-la desajeitada.Query_posts ()nunca é o caminho !!NUNCA!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
-
Issonãomenciona ofiltro 'Solicitar',que é uma ótimamaneira demodificar a consultaprincipal.A vantagem sobre Query_Posts é que afunção limpa a consulta originale gera umanova única como se você usasse WP_Query.Usando ofiltro de solicitação,suamodificação da consulta original antes de serenviada.Eu acho queisso é o que @jeremyclarkeestá chegando acima.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
-
Há umaincrívelexplicaçãoincrível de Query_Postsescritopor John James Jacobynoblog do desenvolvedor.wordpress.com que sopratodasessas respostas da água.Opontoprincipal: `Query_posts 'não *modifica * o loopprincipal,ele * substitui * * depois *jáfoiexecutado.Amelhormaneira demodificar o loopprincipal é através de umfiltro `pre_get_posts`. http://developer.wordpress.com/2012/05/14/Querying-posts-without-quer-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 Vocêestá confundindo aimplementaçãotécnicae propósito.`Query_posts ()` substituir o objeto de loopprincipal,mas o objetivo émodificar o loopprincipal.Também sou calorosamentegostava defiltros de loop,masissonãofoi apergunta.Há a seguintepergunta de outrapessoanessetópico.@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
-
A questãofoi "quando você deve usar ... Query_posts ()"e de acordo com a lógica apresentadaporessapostagem dobloge os comentários acima,a resposta éprovávelnunca.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
-
Então,se étão ruim,por que "Query_Posts"existe?so, if its so bad, why does `query_posts` exist?
- 2
- 2012-09-10
- Manny Fleurmond
-
@Manny Fleurmond Conceitualmente `Query_Posts ()` é umatentativa de desviar os conceitos de loopprincipalpara onível detag demodelotema (facilidade de que é um dospontosfortesparapopularidade WP).Atarefa simplesmente acaboupor ser demaispara atag demodeloparapossivelmente realizar.Os desenvolvedores donúcleofizeram apossibilidade de voz deleficando depreciada,maseunão acho que houvesse decisão sobreisso ainda.@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
-
Você realmentenãopode "usarem qualquer lugar" o WP_Query (),acabei detentare ainda caksem $thilekery-> ht_posts (),recursãoinfinita,consulte 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
-
@Nobugs O loopnessaperguntaestáerradoe há respostaexplicandopor quê.@NoBugs the loop in that question is wrong and there is answer explaining why.
- 1
- 2014-10-21
- Rarst
-
Agghh obrigadoporisso.Finalmente,algofaz sentido.Sério,WordPresse sua documentação ruim.Eunão sei comotal software complicadoe padrões de codificação ruinstornaram-setãopopulares.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
-
Encontreiesteteste de velocidadeentre 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
-
Eu confiariaem talteste ...exatamentenenhum.:) Afunção é um wrapperfino _mery_,qualquer diferença virá de uma ligeira diferençaem argumentose/ouganchos.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
-
Não hánecessidade deemoções,query_posts () é umafunção comefeitos colaterais: definindo umglobal.O WordPress é staggerd comfunções comefeitos colaterais.Estanão é uma questão de desempenho,mas uma qualidade deproblema de qualidade.Olhepara https://developer.wordpress.org/reference/functions/query_posts/e veja o que query_posts.Use WP_Query,amenos que você queira atrapalhar variáveisglobais.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
- vocênunca deve usarquery_posts
. Além do que @rarst disse,oproblema realmentegrande comquery_posts
é,ele quebra o objeto de consultaprincipal (armazenadoem$ WP_Query
). Ummonte depluginse códigopersonalizado depende do objeto de consultaprincipal,portanto,quebra o objeto de consultaprincipal significa que vocêestá quebrando asfuncionalidades depluginse códigopersonalizado. Apenas uma dessasfunções é afunção depaginaçãoimportante,porisso,se você quebrar a consultaprincipal,você quebrará apaginação.Paraprovar o quão ruim
query_posts
é,em qualquermodelo,faça o seguintee compare os resultadosvar_dump ($ WP_Query); query_posts ('& amp;posts_per_page=-1'); var_dump ($ wp_query);
get_posts
ewp_query
é amaneira correta de construir secundárias consultas ( comoposts relacionados,sliders,conteúdoem destaquee conteúdoem páginasfrontaisestáticas) com. Deve-senotar,vocênão deve usarnenhum dos doisem favor da consultaprincipalnapáginainicial,página única ou qualquertipo depágina de arquivo queeleirá quebrar afuncionalidade dapágina. Se vocêprecisarmodificar a consultaprincipal,usepre_get_posts
parafazê-lo,e não uma consultapersonalizada. ( update: parapáginasfrontaisestáticase páginas verdadeiras,consulte Usando Pre_Get_Postsem páginas verdadeirase fronteirasestáticas *)em essência,
wp_query
é usadopela consultaprincipale também é usadoporget_posts
,mas,emboraget_posts ()
usaWp_query
,existem algumas diferenças-
get_posts
émais rápido quewp_query
. Amargem depende da quantidade depostestotais do site. Omotivoparaisso é,get_posts
passes'no_found_rows'=> Verdadeiro
Porpadrãoparawp_query
quepula/legalmente quebra apaginação. Com'no_found_rows'=> True
,WP_Query
Obtém a quantidade depostagens consultadas,em seguida,suba,ondeporpadrão,eleprocura aindatodas aspostagens que correspondem à consultapara calcular apaginação.Porestemotivo,
get_posts ()
deve ser usado apenaspara consultasnãopaginadas. Paginingget_posts
é realmente umagrandebagunça.wp_query
deve ser usadoparatodas as consultaspaginadas -
get_posts ()
não sãoinfluenciadospeloposts _ *
filtrosem quewp_query
éinfluenciadoporessesfiltros. A razão é queget_posts
,porpadrão,passa'suppress_filters'=> Verdadeiro
paraWP_Query
-
get_posts
tem umpar deparâmetrosextras comoinclude
,excluir
,numeração
eCategoria . Essesparâmetros são alteradosem parâmetros válidospara wp_query
antes de serpassadoparawp_query
.Incluir
é alteradoemPost__in
,Excluir
emPost__Not_In
,Categoria
emgato
enumberposts
emposts_per_page
. Apenas umanota,todos dosparâmetros quepodem serpassados parawp_query
funciona comget_posts
,você pode ignorare Não use osparâmetrospadrão deget_posts
-
get_posts
retorna apenas oposts
propriedade dewp_query
enquantowp_query
retorna o objeto completo. Este objeto ébastante útil quando setrata de condicionais,paginaçãoe outrasinformações úteis quepodem ser usadas dentro do loop. -
get_posts
não usa o loop,mas um loopforeachparaexibirposts. Além disso,semtags demodeloestão disponíveisporpadrão.
Setup_PostData ($post)
deve ser usadopara disponibilizar astags demodelo.wp_query
usa astags de loope modeloestão disponíveisporpadrão -
get_posts
passes'ignore_sticky_posts'=> 1
parawp_query
,portantoget_posts
porpadrãoignorapostagenspegajosas
Combaseno acima,para usar
get_posts
ouwp_query
é com vocêe o que você realmenteprecisa da consulta. O acima deveguiá-loem suaescolhaquery_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-
Eugostaria depoder respostasfavoritas.Issoexplicamuito.I wish I could favorite answers. This explains so much.
- 2
- 2017-06-12
- Athoxx
-
Ótimaexplicação! "Get_posts () deve ser usado apenaspara consultasnãopaginadas. Pagining Get_posts é realmente umabagunçagrande. WP_Query deve ser usadoparatodas as consultaspaginadas" ébasicamente que alguémprecisa conhecer o IMO.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
A diferençabásica é que
query_posts()
é realmente apenasparamodificar o loop atual.Quandoterminar,énecessário redefinir o loope enviá-loem suamaneirafeliz.Estemétodotambém é umpoucomaisfácil deentender,simplesmenteporque sua "consulta" ébasicamente uma string de URL que vocêpassapara afunção,assim:query_posts('meta_key=color&meta_value=blue');
Por outro lado,
WP_Query
émais umaferramenta de usogerale émais comoescrever diretamente as consultas do MySQL do quequery_posts()
é.Vocêtambémpode usá-loem qualquer lugar (não apenasno loop)e elenãointerfereem nenhumamensagem atualmenteem execução.Eutendem a usar
WP_Query
commaisfrequência,como acontece.Realmente,vai descerpara o seu casoespecífico.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
Simplesmente Não hánecessidade de usarQuery_Posts ()
.Tudo o quefaz éinstancia umnovo objeto WP_Querye reatribuaessenovo objetoparawp_queryglobal
.Para referência,o seguinte é que afunção Real
Query_Posts ()
.Query_posts ($ consulta) { $ Globals ['WP_Query']=NOVO WP_Query (); Retornar $ Globals ['WP_Query'] - > consulta ($ consulta); }
Instantie seupróprio objeto WP_Query se quiser criar um script de consultapersonalizadoem profundidade.Ou use
get_posts ()
setudo o que vocêprecisafazer é algumamanipulação leve aquie ali.Em ambos os casos,eu recomendofazer umfavor a simesmoe indopara
wp_includes/query.php
e lendo owp_query
classe.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
Certifique-se de usar
wp_reset_query()
depois de usarquery_posts()
porque afetará outro resultado de consultatambém.Make sure that you use
wp_reset_query()
after usingquery_posts()
because it will affect other query result also. -
-
- 2017-07-19
- Query_posts () <./a>:pode ser usadoem um só caso,se vocêprecisarmodificarmainconsulta .Ele definemuitas variáveisglobais;
- get_posts () <) : émuito semelhanteem mecânicae aceita osmesmos argumentos,mas retorna arraydeposts
- wp_query : Vocêpode criare trabalhar com opróprio objeto.Poucomais complexo,menos restrições,é seguro usarem qualquer lugar.
- 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.
Parece quemetade dostutoriaisno codice e ao redor dablogosphere use
query_posts()
e meio usoWP_Query
.Qual é onegócio?