Parece que metade dos tutoriais no Codex e em torno da blogosfera usam query_posts()e usam meio WP_Query. Qual é o problema?
Parece que metade dos tutoriais no Codex e em torno da blogosfera usam query_posts()e usam meio WP_Query. Qual é o problema?
Respostas:
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.
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
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.
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/...
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
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.
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.
Certifique-se de usar wp_reset_query()após o uso, query_posts()pois isso também afetará outros resultados da consulta.