Query_posts: Aprenda a customizar o Loop do WordPress

Se você já sabe como funciona o loop do Wordpress está na hora de levá-lo ao próximo nível. Saiba como limitar o número de posts a serem exibidos, excluir categorias e muito mais, através da customização do loop.

No post anterior discutimos o Loop do WordPress e como ele é utilizado para exibir os posts armazenados no banco de dados de nosso site. Hoje vamos aprender a “customizar” o Loop a fim de adaptá-lo melhor às nossas necessidades.

Bsicamente existem 3 maneiras de customizar o Loop do WordPress, sendo elas:

  1. query_posts()
  2. WP_Query()
  3. get_posts()

Vamos analisar cada uma destas opções, suas vantagens e desvantagens e ver em quais situações melhor aplicá-las.

1. query_posts()

Se você estiver trabalhando com apenas um Loop e deseja modificar o tipo de posts a ser exibido, a ordem de exibição, limitar o número ou mesmo excluir alguma categoria, utilizar query_posts() é a melhor opção. Vamos a um exemplo prático:

Vamos supor que na homepage do seu blog, você queira excluir os posts de uma determinada categoria (neste caso, excluiremos os posts da categoria com ID 7). Isso pode facilmente ser realizado utilizando query_posts() antes do início do Loop padrão. Veja como:

<?php // Loop customizado para excluir a categoria com ID 7

global $query_string; // Guarda os valores passados pela query original

query_posts($query_string.'&cat=-7'); // Aqui indicamos o ID da categoria a ser excluída

// Início do Loop
if(have_posts()) : while(have_posts()) : the_post();
...
endwhile;
...
endif;
// Fim do Loop

wp_reset_query(); // Reset da query customizada

?>

Vale lembrar que quando utilizada, o query_posts(), os parâmetros passados via URL, como número de página e categoria são ignorados e uma nova requisição ao banco é feita com os dados solicitados. Caso você não queira perder essas informações, é importante sempre utilizar a variável global $query_string, como mostrado acima.

Importante: Nunca se esqueça, depois de encerrar um Loop modificado com query_posts(), de utilizar o comando wp_reset_query() para restaurar a query original que poderá ser usada em Loops subsequentes. Isso não é necessário em Loops padrão.

Se quisermos ir além com nosso exemplo e realizar modificações como:

  • exibir posts de apenas uma determinada categoria (neste exemplo, será a categoria de ID 4)
  • limitar em 5 o número de posts a serem exibidos
  • ordena-los por título
  • Descartar os 2 primeiros posts da categoria

Basta passar alguns parâmetros, conforme mostrado abaixo e sem muita dificuldade seu novo Loop estará pronto. Veja:

<?php
$posts = query_posts($query_string.'cat=4&showposts=5&orderby=title&offset=2');
?>

Para ver quais os parâmetros aceitos pela query_posts(), confira este link. Vale lembrar que estes parâmetros podem ser utilizados tanto para query_posts() quanto para WP_Query e get_posts().

Sem dúvida a tag query_posts() é uma ferramenta muito poderosa e que pode ser útil na maioria das situações. Entretanto, vale lembrar que ela também possui algumas desvantagens, como:

  • Utilização de queries adicionais ao banco de dados
  • Tags condicionais como is_page(), is_single(), entre outras, serão alteradas após o uso da query_posts().
  • Não é recomendado o uso em mais de um Loop. Para isso pode-se utilizar WP_Query() ou get_posts().

2. WP_Query()

Quando a tarefa é “customizar” vários Loops, WP_Query() é a ferramenta ideal. O seu uso é muito parecido com o query_posts(). Segue um exemplo:

<?php

$query_customizada = new WP_Query('cat=-6') // Exclui a categoria 6

// Incia o Loop
while($query_customizada->have_posts()) : $query_customizada->the_post();

...

// Encerra o Loop
endwhile;

wp_reset_postdata(); // Reseta a query

?>

Assim como no exemplo mostrado com a query_posts(), o uso da WP_Query() também nos possibilita utilizar uma combinação de parâmetros. Veja abaixo:

<?php
$quey_customizada = new WP_Query('cat=-17,-19,-22&posts_per_page=5&order=ASC');
?>

No exemplo acima estamos excluindo as categorias 17, 19 e 22. Também estamos limitando em 5 o número de posts na página e ordenando a exibição de forma crescente.

Como você deve ter notado, a WP_Query() não necessita do uso da variável global $query_string.

Com WP_Query() é possível criar vários Loops e utilizá-los em diferentes lugares de seu template. Podemos inserir um Loop no rodapé, outro na barra lateral, sem necessidade de utilizá-los em uma ordem pré-determinada. Também é possível modificá-los facilmente incluindo ou retirando parâmetros.

Mesmo com todo o poder de fogo que o WP_Query() nos proporciona, existe uma maneira mais fácil e prática de criar Loops customizados e essa maneira é utilizando get_posts(). Vejamos a seguir.

3. get_posts()

O jeito mais fácil e seguro de criar multiplos Loops é utilizando get_posts(). Para utilizá-lo basta inserir o seguinte código no local onde será criado o Loop.

<?php
// Criação de um Loop adicional com get_posts()

global $post;
$args = array('category=>-3'); // Exclui a categoria 3
$custom_posts = get_posts($args);
foreach($custom_posts as $post) : setup_postdata($post);
...
endforeach;
?>

O código acima é responsável por criar um Loop que nos traz todos os posts exceto os que pertencerem a categoria 3. Utilizando os mesmos parâmetros aceitos pela query_posts() e WP_Query() podemos criar Loops que exibem todo tipo de resultados.
A diferença maior aqui, está no fato de que com get_posts() utilizamos uma array para guardar os parâmetros que vão customizar o Loop. Se quisermos passar múltiplos parâmetros teríamos que fazer o seguinte:

<?php
$args = array('category'=>-7,-8,-9, 'number_posts'=>10, 'order'=>'ASC');
?>

Conclusão

Para modificar o Loop padrão utilizamos query_posts(). Quando desejamos modificar ou criar multiplos Loops, a melhor opção é WP_Query(). Já para criar Loops adicionais (como aqueles presentes na sidebar) utilizamos get_posts().

Espero que tenham gostado! Em caso de dúvidas ou sugestões, deixe seus comentários. Até a próxima!

18 Comentários

  1. Joendel

    Amigo, gostaria muito de fazer isso em meu futuro blog em WP, mais o tutorial está em nivel muito avançado, se pudesse encinar o mesmo passo a passo eu agradeceria muito.

    Responder
  2. Alessandro

    Gostaria de ajuda de como deixar meus post na primeira página como o desse site (www.psd.org.br) sem opção de comentários, links e datas dos post. O tema é o twentyten, ja modifiquei boa parte do que quero falta só isso, mas não sei onde e como alterar os códigos php, para ficar como desse site, desde já agradeço se poderem da uma dica.

    Creio que tenho que alterar o loop…

    Responder
    • Ubiratan Cunha

      Alessandro,

      Pelo que pude ver, a única coisa que você terá que fazer a fim de exibir os últimos posts do blog na primeira página é um loop. E após isso limitar o número de posts para 4 (como no site citado). Para limitar o número de posts exibidos na home, basta clicar em Configuraçòes > Leitura e alterar o número de posts para 4.

      Caso ainda tenha dúvidas me avise!

      Responder
  3. Alessandro

    Eu queria colocar na home do blog, os posts de 2 categorias diferentes, tipo assim, eu tenho no blog as categorias noticias e artigos, do lado esquerdo queria colocar os posts da categoria Noticias, e do lado direito os posts da categoria Artigos, tem como fazer isso, se poder me ajudar desde ja agrdeço.

    Responder
  4. Jessé Gomes Adamuchio

    Bom dia, muito bom seu post! Parabéns pelo site e qualidade dos conteúdos!.

    Estou com um problema aqui, será que poderia me ajudar?

    Eu estou criando um tema e nele possui uma área para publicação dos 3 últimos artigos interessantes na home, mas a posição dos artigos esta na horizontal estou tentando utilizar o queryposts mas ele só exibe a lista na vertical!! Tem como utilizar o queryposts com exibição dos posts no formato horizontal???

    Grato pela atenção!! um abraço!

    Responder
    • Ubiratan Cunha

      OLá Jessé,

      A exibição dos posts (vertical ou horizontal) não depende do Loop. Ela está diretamente ligada ao CSS. Veja se não tem nenhum float ou display inline que pode ser isso que está causando a exibição horizontal.

      Responder
  5. marcelo

    Olá Ubiratan, gostaria de saber como posso fazer para aparecer o nome da categoria igual ao seu site, por exemplo Web >> WordPress, por favor preciso muito disso.

    Responder
  6. Rodolfo Teixeira

    Valeu.

    Só com isso já resolvi meu problema de limitação de post na home. (&showposts=5)

    Abraço.

    Responder
  7. jhouv

    Bem legal tutorial… consegui resolver meus problemas WP_query…. só uma coisa, como é feito para modificar minhas postagens de acordo com taxonomia ou categoria… Ex: se for “Video”, eu adiciono uma classe class=”video” … se for avisdos, adiciono class=”aviso”ATT MMM

    Responder
  8. Danilo

    Tive muito problema com isso, quando peguei um trabalho já pela metade e precisei implementar a paginação das postagens em um Loop customizado. Ainda mais que sou iniciante total com o WordPress.

    Pelo que observei tem que mexer com cuidado com a estrutura do WordPress, se possível já usar tudo de pronto, se não complica.

    Responder
  9. Eduardo

    Olá Ubiratan,

    Muito bom seu post, mas estou com dificuldades em inserir as imagens do meu post dentro do loop redimensionando para o tamanho que preciso se possível. Já pesquisei no google e no codex e não há uma maneira clara para isso poderia dar uma dica?

    Responder
  10. wallace

    meu amigo, eu uso esse seu método em todos os sites que faço..
    porém, quando eu posto algo bom bold não funciona … =//
    o que devo fazer?

    Responder
  11. NT

    Man tava desenvolvendo um template que chegou no momento em que eu tentava de todo jeito mas não funcionava.

    Problema: queria pra cada categoria listar os post ou seja no prioprio codigo difinir um limite onde que liste todos os post da categoria com a quantidade que eu escolher, idependente do opção de leitura do wordpress.

    Ou seja algo em todo de 2000 mil resultados, claro se fosse pela configuração do wordpress o feed poderia pipocar e tbm não ficaria legal, entao vi esse seu post onde tem esse codigo “query_posts($query_string.’&cat=-7′);” me deu uma luz enorme para mim fazer isso.

    Agora pra quem esta tendo dificuldade de fazer isso!, listar uma determinada quantidade de post para todas categoria onde que vc não precisara especificar a categoria e so colocar assim

    query_posts($query_string.’&showposts=Aqui vc digita a quantidade de post’);

    e pronto todas suas categorias vão exibir um limite que vc definiu. Esse site aqui me ajudou no meu problema

    A concatenação da variavel query_string + texto string resolveu meu problema rsrs Obrigadão Parabéns ao site continuem o belo trabalho.

    Responder

Deixe uma Resposta

  • (não será publicado)

XHTML: Você pode usar estas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

© 2017 Mochileiro Digital.

Compartilhe: