$ GLOBALS ['wp_the_query'] vs global $ wp_query

14

¿Cuál es la diferencia entre $GLOBALS['wp_the_query'] y global $wp_query ?

¿Por qué preferir uno sobre el otro?

    
pregunta Nathan Powell 14.03.2016 - 09:12

3 respuestas

24

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 .

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á utilizando correctamente, use $GLOBALS['wp_query'] o $wp_query

EDITAR IMPORTANTE

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

    
respondido por el Pieter Goosen 14.03.2016 - 10:31
2

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'];
    
respondido por el denis.stoyanov 14.03.2016 - 09:29
2

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']

    
respondido por el Jeffrey von Grumbkow 14.03.2016 - 09:27

Lea otras preguntas en las etiquetas