Eu diria global $wp_queryapenas para responder sua pergunta em uma linha!
Sumit
Qual é a diferença?
Nathan Powell
Respostas:
27
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 ).
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
CONCLUIR
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
EDIÇÃO IMPORTANTE
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
Meu comentário não teve a intenção de corrigir, então peço desculpas. Eu estava apenas resumindo (TL; DR se você), enquanto apontando o que eu acredito que é um dos aspectos mais significativos do $wp_the_queryque se refere ao WP_Query::is_main_query()método, que não foi mencionado: D
Evan Mattson
@EvanMattson Desculpas, eu não entendi o seu primeiro comentário ;-). Sim 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 ;-)
Pieter Goosen
Resposta muito bem feita! @EvanMattson Isso deveria ter sido uma edição .
Kaiser
Você pode incluir menção de 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.
Nathan Powell
2
Basicamente, um é cópia do outro. Confira wp-settings.php, linhas 292-305:
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']
Arquive uma edição, pois isso realmente não é uma resposta para a pergunta original. Apenas o FYI também $GLOBALS['foo']permite substituir ou desabilitar a variável. Portanto, é um pouco mais do que você descreve aqui.
global $wp_query
apenas para responder sua pergunta em uma linha!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 pessoalAgora, 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']
A razão para fazê-lo dessa maneira é porque o WordPress viu a chegada da
query_posts
versão 1.5.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éswp_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 usamquery_posts
. Além de quebrar a consulta principal, ela a executa novamente, tornando-a muito mais lenta como uma consulta personalizada normalWP_Query
. Muitas pessoas também não redefinem aquery_posts
consultawp_reset_query()
quando concluídas, o que tornaquery_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 umaquery_posts
consulta foi redefinidawp_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 deWP_Query
si ).Prova rápida, execute o seguinte
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
CONCLUIR
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 usaquery_posts
ou o está usando corretamente, use$GLOBALS['wp_query']
ou$wp_query
EDIÇÃO IMPORTANTE
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
que é essencialmente o mesmo que o que
query_posts
está fazendofonte
global $wp_query
.global $wp_the_query
mantém a referência à consulta principal$wp_the_query
que se refere aoWP_Query::is_main_query()
método, que não foi mencionado: Dis_main_query()
,, que é um invólucro para oWP_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ê executarpre_get_posts
ações e apenas deseja direcionar a consulta principal ;-)is_main_query
função na seção * IMPORTANT EDIT? Eu estava usandopre_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:fonte
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']
fonte
$GLOBALS['foo']
permite substituir ou desabilitar a variável. Portanto, é um pouco mais do que você descreve aqui.