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

390

Parece que metade dos tutoriais no Codex e em torno da blogosfera usam query_posts() e metade usam WP_Query . Qual é o problema?

    
por Dan Gayle 13.09.2010 / 17:58
fonte

8 respostas

629
  • query_posts() é uma maneira excessivamente simplista e problemática de modificar a consulta principal de uma página, substituindo-a por nova instância da consulta. Ele é ineficiente (executa novamente consultas SQL) e falhará em algumas circunstâncias (especialmente quando se trata de paginação de postagens). Qualquer código WP moderno deve usar métodos mais confiáveis, como usar pre_get_posts gancho, para este propósito. TL; DR não use query_posts () ever ;

  • get_posts() é muito semelhante em uso e aceita os mesmos argumentos (com algumas nuances, como diferentes padrões ), mas retorna array de posts, não modifica variáveis globais e é seguro para usar em qualquer lugar;

  • A classe
  • WP_Query capacita os dois nos bastidores, mas você também pode criar e trabalhar com o próprio objeto disso. Pouco mais complexo, menos restrições, também seguro para usar em qualquer lugar.

    
por Rarst 13.09.2010 / 18:10
fonte
52

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

Para provar o quanto query_posts é ruim, 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_posts e WP_Query são a maneira correta de construir consultas secundárias ( como postagens relacionadas, controles deslizantes, conteúdo em destaque e conteúdo em páginas frontais estáticas ) com. Note-se, você não deve usar qualquer um dos dois em favor da consulta principal na home page, página única ou qualquer tipo de página de arquivo, pois vai quebrar a funcionalidade da página. Se você precisar modificar a consulta principal, use pre_get_posts para fazer isso e não uma consulta personalizada. ( UPDATE: Para páginas frontais estáticas e páginas verdadeiras, consulte Usando pre_get_posts em páginas verdadeiras e páginas frontais 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 , existem algumas diferenças

  • get_posts é mais rápido que WP_Query . A margem depende da quantidade total de postagens do site. O motivo para isso é que get_posts passa 'no_found_rows' => true por padrão para WP_Query , que ignora / quebra legalmente a paginação. Com 'no_found_rows' => true , WP_Query obtém a quantidade de postagens consultadas, depois suspira, onde, por padrão, procura por todas as postagens correspondentes à consulta para calcular a paginação.

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

  • get_posts() não são influenciados pelos filtros posts_* , em que WP_Query é influenciado por esses filtros. O motivo é que get_posts , por padrão, passa 'suppress_filters' => true para WP_Query

  • get_posts tem alguns parâmetros extras, como include , exclude , numberposts e category . Esses parâmetros são alterados em parâmetros válidos para WP_Query antes de serem transmitidos para WP_Query . include é alterado para post__in , exclude para post__not_in , category para cat e numberposts para posts_per_page . Apenas uma nota, all dos parâmetros que podem ser passados para WP_Query funciona com get_posts , você pode ignorar e não usar os parâmetros padrão de get_posts

  • get_posts retorna apenas a propriedade $posts de WP_Query , enquanto WP_Query retorna 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_posts não usa o loop, mas um loop foreach 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_Query usa o loop e as tags de modelo estão disponíveis por padrão

  • get_posts passa 'ignore_sticky_posts' => 1 para WP_Query , por isso get_posts por padrão ignora postagens fixas

Com base no que precede, a opção de usar get_posts ou WP_Query depende de você e do que você realmente precisa da consulta. O acima deve guiá-lo em sua escolha

    
por Pieter Goosen 18.06.2015 / 19:46
fonte
29

A diferença básica é que query_posts() é realmente apenas para modificar o Loop atual. Assim que estiver pronto, é necessário redefinir o loop e enviá-lo de maneira feliz. 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 as consultas do MySQL do que query_posts() . Você também pode usá-lo em qualquer lugar (não apenas no Loop) e isso não interfere com as consultas post correntemente em execução.

Costumo usar WP_Query com mais frequência, como acontece. Realmente, vai descer para o seu caso específico.

    
por nickmjones 13.09.2010 / 18:09
fonte
13

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

Para referência, o seguinte é que a função query_posts() 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 quiser criar um script de consulta personalizada detalhado. Ou use get_posts() se tudo que você precisa fazer é alguma manipulação de luz aqui e ali.

Em ambos os casos, recomendo que você faça um favor e vá para wp_includes/query.php e leia atentamente a classe WP_Query .

    
por RebelPhoenix 13.07.2013 / 18:38
fonte
13

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

    
por Bindiya Patoliya 08.07.2013 / 06:50
fonte
9

Se eu me lembro de ter lido corretamente, essencialmente "o loop" está fazendo WP_Query nos arquivos principais, mas de uma maneira mais fácil de entender.

    
por tw2113 23.09.2010 / 22:21
fonte
5
  • 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 posts
  •   
  • WP_Query : você pode criar e trabalhar com seu próprio objeto. Pouco mais complexo, menos restrições, é seguro usar em qualquer lugar.
por dalveer 19.07.2017 / 16:28
fonte
-5

Eu diria que não use get_posts() em um plugin. Ele impõe filtros muito restritivos em alguns casos (set suppress_filters , ignore_sticky_posts , etc.) e provavelmente só deve ser usado em um tema quando você quer algo rápido.

    
por m4olivei 25.09.2013 / 18:03
fonte