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_posts
gancho, 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_Query
nã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_posts
nã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_posts
filtro. 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_posts
e WP_Query
sã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_posts
para 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_posts
são mais rápidos que WP_Query
. A margem depende da quantidade total de postagens do site. A razão para isso é: get_posts
passa 'no_found_rows' => true
por padrão o WP_Query
qual ignora / quebra legalmente a paginação. Com 'no_found_rows' => true
, WP_Query
obté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_Query
deve ser usado para todas as consultas paginadas
get_posts()
não são influenciados pelos posts_*
filtros, onde WP_Query
são influenciados por esses filtros. O motivo é que get_posts
, por padrão, passa 'suppress_filters' => true
paraWP_Query
get_posts
tem um par de parâmetros adicionais, como include
, exclude
, numberposts
e category
. Esses parâmetros são alterados para parâmetros válidos WP_Query
antes de serem passados para WP_Query
. include
é transformado em post__in
, exclude
dentro post__not_in
, category
dentro cat
e numberposts
dentro posts_per_page
. Apenas uma nota, todos os parâmetros que podem ser passados para WP_Query
obras com get_posts
, você pode ignorar e não usar os parâmetros padrão deget_posts
get_posts
retorna apenas a $posts
propriedade de WP_Query
while 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 foreach
loop 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 as tags loop e 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 aderentes
Com base no acima, se você deseja 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
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_Query
mais 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.php
e ler a WP_Query
classe.
Certifique-se de usar wp_reset_query()
após o uso, query_posts()
pois isso também afetará outros resultados da consulta.