Quando você deve usar WP_Query vs query_posts () vs get_posts ()?


Respostas:


667
  • query_posts()é excessivamente simplista e uma maneira problemática de modificar a consulta principal de uma página, substituindo-a por uma nova instância da consulta. É ineficiente (executa novamente as consultas SQL) e falhará completamente em algumas circunstâncias (especialmente frequentemente ao lidar com paginação de postagens). Qualquer código WP moderno deve usar métodos mais confiáveis, como usar o pre_get_postsgancho, para esse fim. TL; DR nunca use query_posts () .

  • get_posts() é muito semelhante no uso e aceita os mesmos argumentos (com algumas nuances, como padrões diferentes), mas retorna uma matriz de postagens, não modifica variáveis ​​globais e é seguro para uso em qualquer lugar.

  • WP_Queryé a classe que potencializa os dois nos bastidores, mas você também pode criar e trabalhar com sua própria instância. Um pouco mais complexo, menos restrições, também seguro para usar em qualquer lugar.


8
@jjeaton query_posts()é pequena função de invólucro para WP_Query, a única coisa extra que faz (como por fluxograma) está substituindo mundial$wp_query
— Rarst

7
@jjeaton Substituir query_posts()por WP_Querynão fará diferença no desempenho, a consulta da página original ainda será executada porque isso faz parte do carregamento principal. Essas consultas serão executadas mesmo que seu arquivo de modelo não tenha nenhum loop.
— Rarst

116
Não posso me livrar da sensação de que este é o post mais genial e votado no WPSE. Também deve estar no Codex.
— kaiser

8
Vou apenas adicionar minha descrição mais clara do problema "performance de query_posts ()": o uso de query_posts () ou WP_Query em um arquivo de modelo terá o mesmo custo de desempenho: a consulta que você acabou de executar. O problema discutido no artigo do codex é que, se você realmente deseja substituir a consulta, deve fazê-lo filtrando os query_posts () originais com o filtro 'parse_query'. Dessa forma, você tem apenas a consulta original, desejável, em vez de fazer uma segunda consulta para substituí-la desajeitadamente. query_posts () nunca é o caminho !! NUNCA!
— precisa saber é o seguinte

22
Há uma explicação incrível de query_posts, escrita por John James Jacoby no blog developer.wordpress.com, que tira todas essas respostas da água. O ponto principal: query_postsnão modificar o loop principal em tudo, ele substitui -lo após ele já foi executado. A melhor maneira de modificar o loop principal é através de um pre_get_postsfiltro. developer.wordpress.com/2012/05/14/...
— Dan Gayle

65

query_posts- Você nunca deve usar query_posts. Além do que o @Rarst disse, o grande problema query_postsé que ele quebra o principal objeto de consulta (armazenado em $wp_query). Muitos plug-ins e códigos personalizados dependem do objeto de consulta principal, portanto, quebrar o objeto de consulta principal significa que você está quebrando as funcionalidades dos plug-ins e do código personalizado. Apenas uma dessas funções é a função de paginação mais importante; portanto, se você interromper a consulta principal, interromperá a paginação.

Para provar o quão ruim query_postsé, em qualquer modelo, faça o seguinte e compare os resultados

var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );

get_postse WP_Querysão a maneira correta de criar consultas secundárias ( como postagens relacionadas, sliders, conteúdo em destaque e conteúdo em páginas estáticas ) com. Observe que você não deve usar nenhum dos dois a favor da consulta principal na página inicial, na página única ou em qualquer tipo de página de arquivamento, pois isso prejudicará a funcionalidade da página. Se você precisar modificar a consulta principal, use pre_get_postspara fazer isso, e não uma consulta personalizada. ( ATUALIZAÇÃO: para páginas iniciais estáticas e páginas verdadeiras, consulte Usando pre_get_posts em páginas verdadeiras e páginas estáticas *)

Em essência, WP_Queryé usado pela consulta principal e também é usado por get_posts, mas, embora get_posts()use WP_Query, há algumas diferenças

  • get_postssão mais rápidos que WP_Query. A margem depende da quantidade total de postagens do site. A razão para isso é: get_postspassa 'no_found_rows' => truepor padrão o WP_Queryqual ignora / quebra legalmente a paginação. Com 'no_found_rows' => true, WP_Queryobtém a quantidade de postagens consultadas e, em seguida, diminui, onde, por padrão, ele pesquisa mais todas as postagens correspondentes à consulta para calcular a paginação.

    Por esse motivo, get_posts()deve ser usado apenas para consultas não paginadas. Paginar get_postsé realmente uma grande bagunça. WP_Querydeve ser usado para todas as consultas paginadas

  • get_posts()não são influenciados pelos posts_*filtros, onde WP_Querysão influenciados por esses filtros. O motivo é que get_posts, por padrão, passa 'suppress_filters' => trueparaWP_Query

  • get_poststem um par de parâmetros adicionais, como include, exclude, numberpostse category. Esses parâmetros são alterados para parâmetros válidos WP_Queryantes de serem passados ​​para WP_Query. includeé transformado em post__in, excludedentro post__not_in, categorydentro cate numberpostsdentro posts_per_page. Apenas uma nota, todos os parâmetros que podem ser passados para WP_Queryobras com get_posts, você pode ignorar e não usar os parâmetros padrão deget_posts

  • get_postsretorna apenas a $postspropriedade de WP_Querywhile WP_Queryretorna o objeto completo. Este objeto é bastante útil quando se trata de condicionais, paginação e outras informações úteis que podem ser usadas dentro do loop.

  • get_postsnão usa o loop, mas um foreachloop para exibir postagens. Além disso, nenhuma tag de modelo está disponível por padrão. setup_postdata( $post )deve ser usado para disponibilizar as tags de modelo. WP_Queryusa as tags loop e template estão disponíveis por padrão

  • get_postspassa 'ignore_sticky_posts' => 1para WP_Query, então, get_postspor padrão, ignora postagens aderentes

Com base no acima, se você deseja usar get_postsou WP_Querydepende de você e do que você realmente precisa da consulta. O acima deve guiá-lo em sua escolha


1
Eu gostaria de poder respostas favoritas. Isso explica muito.
— Patrik Alienus

1
Ótima explicação! "get_posts () deve ser usado apenas para consultas não paginadas. Paginar get_posts é realmente uma grande bagunça. WP_Query deve ser usado para todas as consultas paginadas" É basicamente tudo o que alguém precisa saber.
— Bullyen #

32

A diferença básica é que query_posts()realmente é apenas para modificar o loop atual. Quando terminar, é necessário redefinir o loop e enviá-lo de maneira alegre. Esse método também é um pouco mais fácil de entender, simplesmente porque sua "consulta" é basicamente uma string de URL que você passa para a função, assim:

query_posts('meta_key=color&meta_value=blue'); 

Por outro lado, WP_Queryé mais uma ferramenta de propósito geral e é mais como escrever diretamente consultas MySQL do que query_posts()é. Você também pode usá-lo em qualquer lugar (não apenas no loop) e não interfere em nenhuma consulta de postagem em execução no momento.

Eu costumo usar com WP_Querymais frequência, por acaso. Realmente, isso vai se resumir ao seu caso específico.


15

Simplesmente não há necessidade de usar query_posts(). Tudo o que ele faz é instancia um novo objeto WP_Query e reatribui esse novo objeto global wp_query.

Para referência, o seguinte é essa query_posts()função real .

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

Instancie seu próprio objeto WP_Query se desejar criar um script de consulta personalizado detalhado. Ou use get_posts()se tudo que você precisa fazer é alguma manipulação de luz aqui e ali.

Em ambos os casos, eu recomendo fazer um favor a si mesmo e ir wp_includes/query.phpe ler a WP_Queryclasse.


14

Certifique-se de usar wp_reset_query()após o uso, query_posts()pois isso também afetará outros resultados da consulta.


10

Se bem me lembro da leitura correta, essencialmente "o loop" está funcionando WP_Querynos arquivos principais, mas de uma maneira mais fácil de entender.


6
  • query_posts () : pode ser usado em um único caso, se você precisar modificar a consulta principal. Ele define muitas variáveis ​​globais;
  • get_posts () : é muito semelhante em mecânica e aceita os mesmos argumentos, mas retorna uma matriz de postagens
  • WP_Query : você pode criar e trabalhar com o próprio objeto. Um pouco mais complexo, menos restrições, é seguro usar em qualquer lugar.

-6

Eu diria que não use get_posts()em um plugin. Impõe filtros muito restritivas em alguns casos (de definir suppress_filters, ignore_sticky_posts, etc.) e provavelmente deve ser usado apenas em um tema quando você quer algo bem feito rápido.

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.