¿Cuál es la diferencia entre $GLOBALS['wp_the_query']
y global $wp_query
?
¿Por qué preferir uno sobre el otro?
¿Cuál es la diferencia entre $GLOBALS['wp_the_query']
y global $wp_query
?
¿Por qué preferir uno sobre el otro?
Te has perdido uno, $GLOBALS['wp_query']
. Para todos los efectos, $GLOBALS['wp_query'] === $wp_query
. Sin embargo, $GLOBALS['wp_query']
es mejor para la legibilidad y debe usarse en lugar de $wp_query
, PERO, que sigue siendo una preferencia personal
Ahora, en un mundo perfecto donde los unicornios gobiernan el mundo, $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query
. Por defecto, esto debería ser cierto. Si observamos dónde están configurados estos globales ( wp-settings.php
), verá que el objeto de consulta principal se almacena en $GLOBALS['wp_the_query']
y $GLOBALS['wp_query']
es solo una copia duplicada de $GLOBALS['wp_the_query']
/**
* WordPress Query object
* @global WP_Query $wp_the_query
* @since 2.0.0
*/
$GLOBALS['wp_the_query'] = new WP_Query();
/**
* Holds the reference to @see $wp_the_query
* Use this global for WordPress queries
* @global WP_Query $wp_query
* @since 1.5.0
*/
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
La razón para hacerlo de esta manera, es porque WordPress vio la llegada de query_posts
en la versión 1.5.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Como puede ver, query_posts
establece el objeto de consulta principal en la ejecución de la consulta personalizada actual. Esto rompe la integridad del objeto de consulta principal, lo que le proporciona datos incorrectos, por lo que todo lo que se basa en el objeto de consulta principal se rompe debido a datos incorrectos.
Una forma de contrarrestar esto fue crear otro global para almacenar el objeto de consulta principal, $GLOBALS['wp_the_query']
, que se introdujo en la versión 2.0.0. Este nuevo contenido global mantiene el objeto de consulta principal y $GLOBALS['wp_query']
solo una copia. A través de wp_reset_query()
, ahora podríamos restablecer $GLOBALS['wp_query']
al objeto de consulta principal original para restaurar su integridad.
Pero este no es un mundo perfecto, y query_posts
es el mismo diablo. Aunque miles de advertencias, la gente todavía usa query_posts
. Además de romper la consulta principal, vuelve a ejecutar la consulta principal, haciéndola mucho más lenta que una consulta personalizada normal con WP_Query
. Mucha gente tampoco restablece la consulta query_posts
con wp_reset_query()
cuando termina, lo que hace que query_posts
sea aún más malvado.
Debido a que no podemos hacer nada al respecto y no podemos evitar que los complementos y temas utilicen query_posts
y nunca podemos saber si una consulta query_posts
se restableció con wp_reset_query()
, necesitamos una copia más confiable de la consulta principal El objeto que sabemos nos dará datos correctos y confiables al 99.99999%. Ahí es donde $GLOBALS['wp_the_query']
es útil ya que ningún código relacionado con WordPress puede cambiar su valor ( excepto a través de los filtros y acciones dentro de WP_Query
en sí mismo ).
Prueba rápida, ejecute lo siguiente
var_dump( $GLOBALS['wp_the_query'] );
var_dump( $GLOBALS['wp_query'] );
query_posts( 's=crap' );
var_dump( $GLOBALS['wp_the_query'] );
var_dump( $GLOBALS['wp_query'] );
y comprueba los resultados. $GLOBALS['wp_the_query']
no cambió, y $GLOBALS['wp_query']
tiene. Entonces, ¿cuál es más confiable?
Nota final, $GLOBALS['wp_the_query']
es NO un reemplazo para wp_reset_query()
. wp_reset_query()
debería siempre ser usado con query_posts
, y query_posts
nunca debería ser .
Si necesita un código confiable que casi siempre fallará, use $GLOBALS['wp_the_query']
, si confía y cree en los complementos y el código del tema y cree que nadie usa query_posts
o lo está utilizando correctamente, use $GLOBALS['wp_query']
o $wp_query
Al estar respondiendo preguntas en este sitio desde hace un par de años, vi a muchos usuarios utilizando $wp_query
como variable local, que a su vez también rompe el objeto de consulta principal. Esto aumenta aún más la vulnerabilidad del $wp_query
.
Como ejemplo, algunas personas a esto
$wp_query = new WP_Query( $args );
que en esencia es exactamente lo mismo que hace query_posts
Básicamente una es copia de la otra. Consulte wp-settings.php
, líneas 292-305:
$GLOBALS['wp_the_query'] = new WP_Query();
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
La palabra clave global importa la variable en el ámbito local, mientras que $ GLOBALS solo le otorga acceso a la variable.
Para elaborar, si usas global $wp_the_query;
puede usar $wp_the_query
dentro del alcance local sin usar la palabra global nuevamente. Entonces, básicamente, global $wp_the_query
puede compararse con $wp_the_query = $GLOBALS['wp_the_query']
EDIT
He leído mal wp_query para wp_the_query, por lo que mi respuesta no es una respuesta completa a la pregunta, pero sigue proporcionando información general sobre la diferencia entre global $variable
y $GLOBALS['variable']
Lea otras preguntas en las etiquetas wp-query