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_posts
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 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_posts
consulta wp_reset_query()
quando concluídas, o que torna query_posts
ainda mais ruim.
Como não podemos fazer nada sobre isso, não podemos impedir o uso de plug-ins e temas query_posts
e nunca sabemos se uma query_posts
consulta 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_Query
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 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_posts
query_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_posts
ou 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_query
como 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_posts
está fazendo
$wp_the_query
que 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_posts
ações e apenas deseja direcionar a consulta principal ;-)
is_main_query
função na seção * IMPORTANT EDIT? Eu estava usando pre_get_posts
hoje 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_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 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 $variable
e$GLOBALS['variable']
global $wp_query
apenas para responder sua pergunta em uma linha!