¿Cuándo debería usar WP_Query vs query_posts () vs get_posts ()?
-
-
Consultetambiéneste [análisismásextenso] (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 respuestas
- votos
-
- 2010-09-13
-
query_posts()
es demasiado simplista yformaproblemática demodificar la consultaprincipal de unapágina reemplazándola con unanuevainstancia de la consulta. Esineficiente (vuelve aejecutar consultas SQL) yfallará rotundamenteen algunas circunstancias (especialmente amenudo cuando setrata depaginación depublicaciones). Cualquier código de WPmoderno debería usarmétodosmás confiables,como hacer uso depre_get_posts
hook,paraestepropósito. TL; DR no use query_posts ()nunca . -
get_posts()
tiene un usomuy similar y acepta losmismos argumentos (con algunosmatices,como diferentes valorespredeterminados),pero devuelve una serie depublicaciones,nomodifica las variablesglobales yes seguro de usaren cualquier lugar. -
WP_Query
es la clase queimpulsa a ambos detrás lasescenas,perotambiénpuede crear ytrabajar con supropiainstancia. Unpocomás complejo,menos restricciones,también seguro de usaren cualquier 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) "yes seguro de usaren cualquier lugar" ->perono lo useparaelbucle MAIN.(2) recuerde usar $ query_stringglobal;antes de la línea quetiene 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
-
@scribu luegonuevamente 'get_posts'funcionará aunqueno se recomienda: 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
-
Creo que `query_posts`tambiénesmenoseficienteporqueejecutará consultas adicionales,cuando si usa solo` WP_Query`para subucleprincipal,soloejecutará la consulta queelijaen 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 ()`es unapequeñafunción contenedorapara `WP_Query`,lo único adicional que hace (segúnel diagrama deflujo)es sobrescribirel` $ wp_query`global@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
-
@Rarst Meestaba refiriendo a [esta sección del Codexpara query_posts] (http://codex.wordpress.org/Function_Reference/query_posts#Additional_SQL_Queries) sinembargo,puedoestarequivocado con respecto alefecto sobreel rendimiento.Amenos queel uso de WP_Queryen su archivo deplantillatambiéntendráelmismo resultado (es decir,descartar su consulta y volver aejecutar)@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 Reemplazar `query_posts ()`por `WP_Query`no haráninguna diferenciaen el rendimiento,la consulta de lapágina original aún seejecutaráporqueesoesparte de la carga delnúcleo.Esas consultas seejecutaránincluso si su archivo deplantillanotiene ningúnbucle.@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
-
Nopuedo deshacerme de la sensación de queestaes lapublicaciónmásgenial y conmás votosen WPSE.También deberíaestaren el 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,después demirarlopormás debastantetiempo,creo que a `query_posts ()` lefalta una varestática que seestableceen true después delprimer uso y,si se usa dos veces,debería activar `_doing_it_wrong ();`.Supongo que voy amolestar a los chicos de WP-Hacker o Trac sobreesto.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
-
@kaiserbueno ... usar `query_posts ()` dos vecesestanmalo como una vez,noimportatanto comoparamí.:) Por cierto,Andrew Nacin va a hacer unapresentación sobre las consultas y dijo quepodríaproponer algunasmejoras al diagrama deflujo,por lo que la versión dospodríaestar disponibleen elfuturo.@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
-
Solo agregarémi descripciónmás clara delproblema "rendimiento de query_posts ()":el uso de query_posts () o WP_Query dentro de un archivo deplantillatendráelmismo costo de rendimiento: la consulta que acaba de realizar.Elproblema que se analizaen el artículo del códicees que si realmente desea reemplazar la consulta,debe hacerlofiltrandoel query_posts () original conelfiltro 'parse_query'.Deesamanera,solotendrá la consulta deseable original,en lugar de hacer una segunda consultapara reemplazarla demaneraincómoda.query_posts () NUNCA ES EL CAMINO !!¡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
-
Estonomencionaelfiltro de 'solicitud',quees unaexcelentemanera demodificar la consultaprincipal.La ventaja sobre query_postses que lafunciónborra la consulta original ygenera unanueva,igual que si utilizara WP_Query.Al utilizarelfiltro de solicitud,modificará la consulta original antes de que seenvíe.Creo queesoes lo que @JeremyClarkeestá llegando arriba.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
-
Hay unaincreíbleexplicación de query_postsescritapor John James Jacobyen elblog developer.wordpress.com que sacatodasestas respuestas del agua.Elpuntoprincipal: `query_posts`no *modifica *elbucleprincipalen absoluto,* lo * reemplaza * después * de que ya se haejecutado.Lamejorforma demodificarelbucleprincipales através de 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,estás confundiendo laimplementacióntécnica yelpropósito.`query_posts ()` reemplazael objeto delbucleprincipal,pero supropósitoesmodificarelbucleprincipal.Tambiénme gustanmucho losfiltros debucle,peroesanofue lapregunta.Hay unapregunta de seguimiento de otrapersona sobreesetema.@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
-
Lapreguntaera "¿Cuándo debería usar ... query_posts ()" y de acuerdo con la lógicapresentadaporesapublicación deblog y los comentarios anteriores,esprobable que la respuesta seanunca.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
-
@Manny Fleurmond conceptualmente `query_posts ()`es unintento de simplificar los conceptos delbucleprincipal alnivel de laetiqueta de laplantilla deltema (lafacilidades uno de lospuntosfuertes de lapopularidad de WP).Latarea simplemente resultó ser demasiadopara que laetiqueta deplantillapudiera realizarla.Los desarrolladoresprincipales hicieron laposibilidad de que se desaprobara,perono creo que haya habido una decisión al respectotodavía.@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
-
En realidad,nopuede "usaren ningún lugar"el WP_Query (),lo acabo deintentar ytodavía croaen $thequery-> have_posts (),recursividadinfinita,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
-
@NoBugselbucleen esapreguntaesincorrecto y hay una respuesta queexplicapor qué.@NoBugs the loop in that question is wrong and there is answer explaining why.
- 1
- 2014-10-21
- Rarst
-
Agghhgraciasporesto.Finalmente,algotiene sentido.En serio,WordPress y supésima documentación.No sé cómo un softwaretan complicado y unosmalosestándares de codificación se volvierontanpopulares.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
-
Encontréestaprueba de velocidadentre wp_query yget_posts http://www.wpclocked.com/Found this speed test between wp_query and get_posts http://www.wpclocked.com/
- 1
- 2015-07-18
- Anagio
-
Confiaríaen talprueba ...exactamenteninguna.:) Lafunciónes unaenvoltura _muy_ delgada,cualquier diferencia vendrá de una ligera diferenciaen los argumentos y/oganchos.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
-
No haynecesidad deemociones,query_posts ()es unafunción conefectos secundarios:establecer unglobal.WordPressestá asombrado confunciones conefectos secundarios.No setrata de unproblema de rendimiento,sino de la calidad del código.Mire https://developer.wordpress.org/reference/functions/query_posts/y vea qué hace query_posts.Utilice WP_Query amenos que desee alterar las variablesglobales.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
:nunca debería utilizarquery_posts
. Aparte de lo que ha dicho @Rarst,elproblema realmentegrande conquery_posts
es que rompeel objeto de consultaprincipal (almacenadoen$ wp_query
). Muchos complementos y códigopersonalizado sebasanen el objeto de consultaprincipal,por lo que romperel objeto de consultaprincipal significa queestá rompiendo lasfuncionalidades de los complementos yel códigopersonalizado. Solo una deesasfuncioneses lafunción depaginaciónmásimportante,por lo que si rompe la consultaprincipal,rompe lapaginación.Para demostrar quétanmaloes
query_posts
,en cualquierplantilla,haga lo siguiente y compare los resultadosvar_dump ($ wp_query); query_posts ('& amp;posts_per_page=-1'); var_dump ($ wp_query);
get_posts
yWP_Query
son laforma correcta de construir consultas secundarias ( comopublicaciones relacionadas,controles deslizantes,contenido destacadoy contenidoen portadasestáticas) con. Cabe señalar queno debe utilizarninguno de los dos afavor de la consultaprincipalen lapágina deinicio,una solapágina o cualquiertipo depágina de archivo,ya que romperá lafuncionalidad de lapágina. Sinecesitamodificar la consultaprincipal,usepre_get_posts
para hacerlo,yno una consultapersonalizada. ( ACTUALIZACIÓN: Paraportadasestáticas ypáginas reales,consulte Uso depre_get_postsen páginas reales yportadasestáticas *)Enesencia,
WP_Query
es usadopor la consultaprincipal ytambiénes usadoporget_posts
,pero aunqueget_posts ()
usaWP_Query
,hay algunas diferenciasget_posts
sonmás rápidos queWP_Query
. Elmargen depende de la cantidad depublicacionestotales del sitio. La razón deestoes queget_posts
pasa'no_found_rows'=>true
por defecto aWP_Query
que omite/rompe legalmente lapaginación. Con'no_found_rows'=>true
,WP_Query
obtiene la cantidad depublicaciones consultadas,luego rescata,donde deformapredeterminada,buscatodas laspublicaciones que coinciden con la consultapara calcular lapaginación.Poresta razón,
get_posts ()
debe usarse solopara consultasnopaginadas. Paginarget_posts
es realmente ungran lío.WP_Query
debe usarseparatodas las consultaspaginadasget_posts ()
noestáninfluenciadospor losfiltrosposts_ *
dondeWP_Query
se veinfluenciadoporestosfiltros. Elmotivoes queget_posts
,deformapredeterminada,pasa'suppress_filters'=> verdadero
aWP_Query
get_posts
tiene unpar deparámetros adicionales comoinclude
,exclude
,numberposts
ycategoría
. Estosparámetros se cambian aparámetros válidosparaWP_Query
antes depasar aWP_Query
.include
se cambia apost__in
,exclude
apost__not_in
,categoría
acat
ynumberposts
enposts_per_page
. Solo unanota,todos losparámetros que sepuedenpasar aWP_Query
funcionan conget_posts
,puede ignorar yno utilice losparámetrospredeterminados deget_posts
get_posts
devuelve solo lapropiedad$posts
deWP_Query
mientras queWP_Query
devuelveel objeto completo. Este objetoesbastante útil cuando setrata de condicionales,paginación y otrainformación útil que sepuede utilizar dentro delbucle.get_posts
no usaelbucle,sino unbucleforeach
paramostrar laspublicaciones. Además,no hayetiquetas deplantilla disponibles deformapredeterminada.setup_postdata ($post)
debe usarsepara que lasetiquetas de laplantillaestén disponibles.WP_Query
utilizaelbucle y lasetiquetas deplantillaestán disponibles deformapredeterminadaget_posts
pasa'ignore_sticky_posts'=> 1
aWP_Query
,por lo queget_posts
por defectoignora laspublicacionesfijas
De acuerdo con lo anterior,si usar
get_posts
oWP_Query
depende de usted y quées lo que realmentenecesita de la consulta. Lo anterior deberíaguiarloen suelecciónquery_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-
Ojalápudieramis respuestasfavoritas.Estoexplicamuchas cosas.I wish I could favorite answers. This explains so much.
- 2
- 2017-06-12
- Athoxx
-
¡Gran Explicación! "get_posts () debe usarse solopara consultasnopaginadas. Paginarget_postses realmente ungran lío. WP_Query debe usarseparatodas las consultaspaginadas" Esbásicamentetodo lo que alguiennecesita saberen mi opinión.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 diferenciabásicaes que
query_posts()
es realmente soloparamodificarelbucle actual.Una vez que hayaterminado,esnecesario restablecerel ciclo yenviarloen su camino alegre.Estemétodotambiénes unpocomásfácil deentender,simplementeporque su "consulta"esbásicamente una cadena de URL quepasa a lafunción,así:query_posts('meta_key=color&meta_value=blue');
Por otro lado,
WP_Query
esmás una herramienta depropósitogeneral,y separecemás aescribir directamente consultas MySQL quequery_posts()
.Tambiénpuede usarloen cualquier lugar (no soloen elbucle) ynointerfiere conninguna consulta depublicación que seestéejecutando actualmente.Suele usar
WP_Query
conmásfrecuencia,como suele ocurrir.Realmente,se reducirá a su 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
Simplementenoesnecesario utilizar
query_posts()
.Todo lo que haceesinstanciar unnuevo objeto WP_Query y reasignaresenuevo objeto aglobal wp_query
.Como referencia,lo siguientees lafunción real
query_posts()
.function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); }
Cree unainstancia de supropio objeto WP_Query si desea crear un script de consultapersonalizadoen profundidad.O use
get_posts()
sitodo lo quenecesita haceres una ligeramanipulación aquí y allá.En cualquier caso,le recomiendo que se haga unfavor y vaya a
wp_includes/query.php
yexamine la claseWP_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
Asegúrese de usar
wp_reset_query()
después de usarquery_posts()
porquetambién afectaráel resultado de otras consultas.Make sure that you use
wp_reset_query()
after usingquery_posts()
because it will affect other query result also. -
-
- 2017-07-19
- query_posts () :podría usarseen un solo caso sinecesitamodificar laconsulta .Establecemuchas variablesglobales;
- get_posts () :esmuy similaren mecánica y acepta losmismos argumentos,pero devuelve unamatrizdepublicaciones
- WP_Query :puede crear ytrabajar con supropio objeto.Unpocomás complejo,conmenos restricciones,es seguro de usaren cualquier 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 que lamitad de lostutoriales del Codex y de lablogosfera usan
query_posts()
y lamitad usanWP_Query
.¿Cuáleseltrato?