$ GLOBALS ['wp_the_query'] vs global $ wp_query


16

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

Por que preferir um sobre o outro?


2
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 ).

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

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


1
query_posts () muda global $wp_query. global $wp_the_querymantém a referência à consulta principal
Evan Mattson

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:

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

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

2

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.
Kaiser #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.