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.