Qual é a diferença entre $GLOBALS['wp_the_query']e global $wp_query?
Por que preferir um sobre o outro?
Qual é a diferença entre $GLOBALS['wp_the_query']e global $wp_query?
Por que preferir um sobre o outro?
Respostas:
Você perdeu um $GLOBALS['wp_query']. Para todos os fins $GLOBALS['wp_query'] === $wp_query,. $GLOBALS['wp_query']é, no entanto, melhor para facilitar a leitura e deve ser usado em vez de $wp_query, MAS, que permanece a preferência pessoal
Agora, em um mundo perfeito onde os unicórnios governam o mundo $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query,. Por padrão, isso deve ser verdade. Se observarmos onde essas globais estão definidas ( wp-settings.php), você verá que o objeto de consulta principal está armazenado $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 fazê-lo dessa maneira é porque o WordPress viu a chegada da query_postsversão 1.5.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Como você pode ver, query_postsdefine o objeto de consulta principal para a execução personalizada atual da consulta. Isso quebra a integridade do objeto de consulta principal, que fornece dados incorretos; portanto, tudo o que depende do objeto de consulta principal é quebrado devido a dados incorretos.
Uma maneira de combater isso foi criar outra global para armazenar o objeto de consulta principal, $GLOBALS['wp_the_query']que foi introduzido na versão 2.0.0. Essa nova global mantém o objeto de consulta principal e $GLOBALS['wp_query']apenas uma cópia. Através wp_reset_query(), podemos agora redefinir $GLOBALS['wp_query']volta para o objeto consulta principal original para restaurar a 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 a executa novamente, tornando-a muito mais lenta como uma consulta personalizada normal WP_Query. Muitas pessoas também não redefinem a query_postsconsulta wp_reset_query()quando concluídas, o que torna query_postsainda mais ruim.
Como não podemos fazer nada sobre isso, não podemos impedir o uso de plug-ins e temas query_postse nunca sabemos se uma query_postsconsulta foi redefinida wp_reset_query(), precisamos de uma cópia mais confiável do objeto de consulta principal que sabemos que nos dará 99,99999% confiável, correto dados. É aqui 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 de WP_Querysi ).
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 mudou, e $GLOBALS['wp_query']tem. Então, qual é mais confiável?
Nota final, NÃO$GLOBALS['wp_the_query'] é um substituto para . sempre deve ser usado com e nunca deve ser usado.wp_reset_query()wp_reset_query()query_postsquery_posts
Se você precisar de um código confiável que quase sempre nunca irá falhar, use $GLOBALS['wp_the_query'], se você confia e acredita em plugins e código de tema e acredita que ninguém usa query_postsou o está usando corretamente, use $GLOBALS['wp_query']ou$wp_query
Respondendo a perguntas neste site há alguns anos, vi muitos usuários usando $wp_querycomo 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 é essencialmente o mesmo que o que query_postsestá fazendo
$wp_the_queryque se refere ao WP_Query::is_main_query()método, que não foi mencionado: D
is_main_query(),, que é um invólucro para o WP_Query::is_main_query()qual verifica o objeto de consulta atual contra o objeto de consulta principal salvo em $GLOBALS['wp_the_query']. Isto é muito importante quando você executar pre_get_postsações e apenas deseja direcionar a consulta principal ;-)
is_main_queryfunção na seção * IMPORTANT EDIT? Eu estava usando pre_get_postshoje e achei totalmente útil usar essa função desde que eu estava olhando $wp_query.
Basicamente, um é cópia do outro. Confira wp-settings.php, linhas 292-305:
$GLOBALS['wp_the_query'] = new WP_Query();
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
A palavra-chave global importa a variável para o escopo local, enquanto $ GLOBALS apenas concede acesso à variável.
Para elaborar, se você usar, global $wp_the_query;
poderá usar $wp_the_querydentro do escopo local sem usar a palavra global novamente. Então, basicamente, global $wp_the_querypode ser comparado a$wp_the_query = $GLOBALS['wp_the_query']
EDITAR
Eu li mal wp_query para wp_the_query, portanto, minha resposta não é uma resposta completa à pergunta, mas ainda fornece informações gerais sobre a diferença entre global $variablee$GLOBALS['variable']
global $wp_queryapenas para responder sua pergunta em uma linha!