wp-query – $ GLOBALS ['wp_the_query'] frente a $ wp_query global

Pregunta:

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

¿Por qué preferir uno sobre el otro?

Respuesta:

Te has perdido uno, $GLOBALS['wp_query'] . A todos los efectos, $GLOBALS['wp_query'] === $wp_query . $GLOBALS['wp_query'] es, sin embargo, mejor para la legibilidad y debe usarse en lugar de $wp_query , PERO, eso 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 . De forma predeterminada, esto debería ser cierto. 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 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. A través de wp_reset_query() , ahora podemos restablecer $GLOBALS['wp_query'] 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 . Mucha gente tampoco restablece la consulta query_posts con wp_reset_query() cuando query_posts , lo que hace que query_posts sea ​​aún más maligno.

Debido a que no podemos hacer nada al respecto, y no podemos evitar que los complementos y temas usen query_posts y nunca podemos saber si una consulta query_posts se restableció con wp_reset_query() , necesitamos una copia más confiable del objeto de consulta principal que sabemos que nos dará 99,99999% de datos fiables y correctos. 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 ).

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'] . Entonces, ¿cuál es más confiable?

Nota final, $GLOBALS['wp_the_query'] NO es un reemplazo para wp_reset_query() . wp_reset_query() siempre debe usarse con query_posts , y query_posts nunca debe usarse.

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 de $wp_query .

Como ejemplo, algunas personas a esto

$wp_query = new WP_Query( $args );

que es, en esencia, exactamente lo mismo que están haciendo query_posts

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım