$ GLOBALS ['wp_the_query'] vs global $ wp_query

14

Qual é a diferença entre $GLOBALS['wp_the_query'] e global $wp_query ?

Por que preferir um ao outro?

    
por Nathan Powell 14.03.2016 / 09:12

3 respostas

24

Você perdeu um, $GLOBALS['wp_query'] . Para todos os efeitos, $GLOBALS['wp_query'] === $wp_query . No entanto, $GLOBALS['wp_query'] é melhor para a legibilidade e deve ser usado em vez de $wp_query , MAS, essa continua sendo a preferência pessoal

Agora, em um mundo perfeito onde os unicórnios dominam o mundo, $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query . Por padrão, isso deve ser verdade. Se olharmos para onde esses globais estão definidos ( wp-settings.php ), você verá que o objeto de consulta principal está armazenado em $GLOBALS['wp_the_query'] e $GLOBALS['wp_query'] é apenas uma cópia 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'];

A razão para isso é que o WordPress viu a chegada de query_posts na versão 1.5.

function query_posts($query) {
    $GLOBALS['wp_query'] = new WP_Query();
    return $GLOBALS['wp_query']->query($query);
}

Como você pode ver, query_posts define o objeto de consulta principal como a execução atual da consulta personalizada. Isso quebra a integridade do objeto de consulta principal, que fornece dados incorretos, portanto, qualquer coisa que dependa do objeto de consulta principal é interrompida devido a dados incorretos.

Uma maneira de combater isso foi criar outro global para armazenar o objeto de consulta principal, $GLOBALS['wp_the_query'] , que foi introduzido na versão 2.0.0. Este novo global mantém o objeto de consulta principal e $GLOBALS['wp_query'] apenas uma cópia. Por meio de wp_reset_query() , agora poderíamos redefinir $GLOBALS['wp_query'] de volta para o objeto de consulta principal original para restaurar sua integridade.

Mas este não é um mundo perfeito, e query_posts é o próprio diabo. Apesar de milhares de avisos, as pessoas ainda usam query_posts . Além de quebrar a consulta principal, ela reexecuta a consulta principal, tornando-a muito mais lenta como uma consulta personalizada normal com WP_Query . Muitas pessoas também não redefinem a consulta query_posts com wp_reset_query() quando concluídas, o que torna query_posts ainda mais maligno.

Como não podemos fazer nada sobre isso e não podemos impedir que plug-ins e temas usem query_posts e nunca podemos saber se uma consulta query_posts foi redefinida com wp_reset_query() , precisamos de uma cópia mais confiável da consulta principal objeto que sabemos que nos dará 99,99999% de dados confiáveis, corretos. É aí que $GLOBALS['wp_the_query'] é útil, pois nenhum código relacionado ao WordPress pode alterar seu valor (, exceto através dos filtros e ações dentro do WP_Query em si ).

Prova rápida, execute o seguinte

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

e verifique os resultados. $GLOBALS['wp_the_query'] não foi alterado e $GLOBALS['wp_query'] foi alterado. Então, qual é mais confiável?

Nota final, $GLOBALS['wp_the_query'] NÃO é um substituto para wp_reset_query() . wp_reset_query() deve sempre ser usado com query_posts e query_posts deve nunca ser usado.

PARA CONCLUIR

Se você precisar de código confiável que quase sempre nunca falhará, use $GLOBALS['wp_the_query'] , se confiar e acreditar em plug-ins e código de tema e acreditar que ninguém usa query_posts ou está usando corretamente, use $GLOBALS['wp_query'] ou $wp_query

EDIÇÃO IMPORTANTE

Estando respondendo a perguntas neste site por alguns anos, vi muitos usuários usando $wp_query como uma variável local, o que, por sua vez, também quebra o objeto de consulta principal. Isso aumenta ainda mais a vulnerabilidade do $wp_query .

Como exemplo, algumas pessoas para isso

$wp_query = new WP_Query( $args );

que é basicamente o mesmo que o query_posts está fazendo

    
por Pieter Goosen 14.03.2016 / 10:31
2

Basicamente, uma é a cópia da outra. Confira wp-settings.php , linhas 292-305:

$GLOBALS['wp_the_query'] = new WP_Query();

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
    
por denis.stoyanov 14.03.2016 / 09:29
2

A palavra-chave global importa a variável para o escopo local, enquanto o $ GLOBALS apenas lhe concede acesso à variável.

Para elaborar, se você usar global $wp_the_query; você pode usar $wp_the_query dentro do escopo local sem usar a palavra global novamente. Então, basicamente global $wp_the_query pode ser comparado a $wp_the_query = $GLOBALS['wp_the_query']

EDITAR

Eu interpretei mal wp_query para wp_the_query, então minha resposta não é uma resposta completa para a pergunta, mas ainda fornece informações gerais sobre a diferença entre global $variable e $GLOBALS['variable']

    
por Jeffrey von Grumbkow 14.03.2016 / 09:27

Tags