Parece que metade dos tutoriais no Codex e em torno da blogosfera usam query_posts()
e usam meio WP_Query
. Qual é o problema?
wp-query
query-posts
query
get-posts
Dan Gayle
fonte
fonte
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 opre_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.fonte
query_posts()
é pequena função de invólucro paraWP_Query
, a única coisa extra que faz (como por fluxograma) está substituindo mundial$wp_query
query_posts()
porWP_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 umpre_get_posts
filtro. developer.wordpress.com/2012/05/14/...query_posts
- Você nunca deve usarquery_posts
. Além do que o @Rarst disse, o grande problemaquery_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 resultadosget_posts
eWP_Query
são a maneira correta de criar consultas secundárias ( como postagens relacionadas, sliders, conteúdo em destaquee 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, usepre_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 porget_posts
, mas, emboraget_posts()
useWP_Query
, há algumas diferençasget_posts
são mais rápidos queWP_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 oWP_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. Paginarget_posts
é realmente uma grande bagunça.WP_Query
deve ser usado para todas as consultas paginadasget_posts()
não são influenciados pelosposts_*
filtros, ondeWP_Query
são influenciados por esses filtros. O motivo é queget_posts
, por padrão, passa'suppress_filters' => true
paraWP_Query
get_posts
tem um par de parâmetros adicionais, comoinclude
,exclude
,numberposts
ecategory
. Esses parâmetros são alterados para parâmetros válidosWP_Query
antes de serem passados paraWP_Query
.include
é transformado empost__in
,exclude
dentropost__not_in
,category
dentrocat
enumberposts
dentroposts_per_page
. Apenas uma nota, todos os parâmetros que podem ser passados paraWP_Query
obras comget_posts
, você pode ignorar e não usar os parâmetros padrão deget_posts
get_posts
retorna apenas a$posts
propriedade deWP_Query
whileWP_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 umforeach
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ãoget_posts
passa'ignore_sticky_posts' => 1
paraWP_Query
, então,get_posts
por padrão, ignora postagens aderentesCom base no acima, se você deseja usar
get_posts
ouWP_Query
depende de você e do que você realmente precisa da consulta. O acima deve guiá-lo em sua escolhafonte
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:Por outro lado,
WP_Query
é mais uma ferramenta de propósito geral e é mais como escrever diretamente consultas MySQL do quequery_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.fonte
Simplesmente não há necessidade de usar
query_posts()
. Tudo o que ele faz é instancia um novo objeto WP_Query e reatribui esse novo objetoglobal wp_query
.Para referência, o seguinte é essa
query_posts()
função real .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 aWP_Query
classe.fonte
Certifique-se de usar
wp_reset_query()
após o uso,query_posts()
pois isso também afetará outros resultados da consulta.fonte
Se bem me lembro da leitura correta, essencialmente "o loop" está funcionando
WP_Query
nos arquivos principais, mas de uma maneira mais fácil de entender.fonte
fonte
Eu diria que não use
get_posts()
em um plugin. Impõe filtros muito restritivas em alguns casos (de definirsuppress_filters
,ignore_sticky_posts
, etc.) e provavelmente deve ser usado apenas em um tema quando você quer algo bem feito rápido.fonte