Si hallas algún error con tu código o trabajo, recuerda probar siempre en un entorno de testing antes añadir el código al trabajo final.
Solución:
Te has perdido uno, $GLOBALS['wp_query']
. Para todos los propósitos, $GLOBALS['wp_query'] === $wp_query
. $GLOBALS['wp_query']
Sin embargo, es mejor para la legibilidad y debe usarse en lugar de $wp_query
, PERO, eso sigue siendo 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 true. Si miramos dónde se establecen estos globales (wp-settings.php
), verá que el objeto de consulta principal está almacenado 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 se puede ver, query_posts
establece el objeto de consulta principal en la consulta personalizada actual que se está ejecutando. Esto rompe la integridad del objeto de consulta principal, lo que le proporciona datos incorrectos, por lo que cualquier cosa que dependa del 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 global contiene el objeto de consulta principal y $GLOBALS['wp_query']
solo una copia. Mediante wp_reset_query()
, ahora podríamos reiniciar $GLOBALS['wp_query']
volver al objeto de consulta principal original para restaurar su integridad.
Pero este no es un mundo perfecto, y query_posts
son el mismo diablo. Aunque hay 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
. Muchas personas tampoco restablecen el query_posts
consulta con wp_reset_query()
cuando termine, lo que hace query_posts
aún más malvado.
Porque no podemos hacer nada al respecto, y no podemos evitar que los complementos y temas usen query_posts
y nunca podremos saber si un query_posts
la consulta se restableció con wp_reset_query()
, necesitamos una copia más confiable del objeto de consulta principal que sabemos que nos dará un 99,99999% de datos correctos y fiables. Eso 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 WP_Query
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 comprobar 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ían siempre ser usado con query_posts
, y query_posts
deberían Nunca ser usado.
PARA CONCLUIR
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á usando correctamente, use $GLOBALS['wp_query']
o $wp_query
EDICIÓN IMPORTANTE
Al estar respondiendo preguntas en este sitio durante un par de años, vi a muchos usuarios usando $wp_query
como una 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 es, en esencia, exactamente lo mismo que lo que query_posts
estás haciendo
La palabra clave global importa la variable en el ámbito local, mientras que $ GLOBALS solo le otorga acceso a la variable.
Para elaborar, si usa global $wp_the_query;
puedes usar $wp_the_query
dentro del ámbito local sin volver a utilizar la palabra global. Así que básicamente global $wp_the_query
se puede comparar con $wp_the_query = $GLOBALS['wp_the_query']
EDITAR
Leí mal wp_query para wp_the_query, por lo que mi respuesta no es una respuesta completa a la pregunta, pero aún proporciona información general sobre la diferencia entre global $variable
y $GLOBALS['variable']
Básicamente, uno es copia del otro. Verificar wp-settings.php
, líneas 292-305:
$GLOBALS['wp_the_query'] = new WP_Query();
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
Te mostramos las comentarios y valoraciones de los lectores
Si entiendes que ha resultado de ayuda nuestro post, sería de mucha ayuda si lo compartieras con otros seniors de esta manera nos ayudas a extender este contenido.