it-swarm-pt.tech

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

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

412
Dan Gayle
  • 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. Ele é ineficiente (executa 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 fazer uso do pre_get_posts hook, para esse 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 padrões diferentes), mas retorna uma matriz de posts, não modifica variáveis ​​globais e é seguro para usar em qualquer lugar.

  • WP_Query é a classe que fortalece os 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.

658
Rarst

query_posts - Você nunca deve usar query_posts. Além do que @Rarst disse, o grande problema com query_posts é que ele quebra o objeto de consulta principal (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 customizado. 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 secondary queries (como postagens relacionadas, sliders, 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 página inicial, única página 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, veja 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 apesar de get_posts() usar WP_Query, existem algumas diferenças

  • get_posts são mais rápidos que WP_Query. A margem depende da quantidade total de postagens do site. A razão para isto é, 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 e, em seguida, suspensa, 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. Paginar 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. A razão é 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 passados ​​para WP_Query. include é alterado para post__in, exclude em post__not_in, category em cat e numberposts em posts_per_page. Apenas uma nota, all dos parâmetros que podem ser passados ​​para WP_Query funciona com get_posts, você pode ignore e não usa os parâmetros default 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 posts. Além disso, nenhuma tag de modelo está disponível por padrão. setup_postdata( $post ) deve ser usado para disponibilizar as tags de template. WP_Query usa o loop e as tags de template estão disponíveis por padrão

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

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

60
Pieter Goosen

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. Este método também é um pouco mais fácil de entender, simplesmente porque sua "query" é 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 não interfere em nenhuma consulta de postagem em execução no momento.

Eu costumo usar WP_Query com mais freqüência, como acontece. Realmente, vai descer para o seu caso específico.

31
nickmjones

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 a você mesmo fazer um favor e ir para wp_includes/query.php e examinar a classe WP_Query.

15
RebelPhoenix

Certifique-se de usar wp_reset_query() depois de usar query_posts() porque isso afetará outros resultados da consulta também.

14
Bindiya Patoliya

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

10
tw2113
  • 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 array de posts
  • WP_Query : você pode criar e trabalhar com o próprio objeto dele. Pouco mais complexo, menos restrições, é seguro usar em qualquer lugar.
6
dalveer