Como listar os posts de determinada categoria ou tag no WordPress

Conhece a Digital Ocean? Tenha VPS em cloud pagando a partir de US$ 5 por mês! Cadastre-se pelo meu link de afiliado aqui e ganhe US$ 10! Dá para testar o plano mais básico por 2 meses, ou o segundo por um... Existem várias distros Linux pré-configuradas, muitos tutoriais de instalação dos serviços web e um excelente suporte. O serviço é rápido e estável, tenho gostado muito! Vale a pena conferir e resgatar os seus 10 dólares de crédito ao ativar sua conta. Eles aceitam PayPal ;)

por Marcos Elias

Pode ser bom dar destaque a alguns posts de determinadas categorias no seu blog. Aqui no Explorando tenho destacado na home os posts sobre Windows 8, dicas de WordPress e outras para blogueiros e também as dicas de Linux, embora escrevo bem menos sobre o pinguim.

Cada site tem seu tipo de conteúdo e tal, mas em geral sempre uma ou mais categorias ou tags merecem atenção especial. Destacá-las no template é uma boa forma de torná-las ainda mais populares, chamando a atenção dos visitantes que você já tem numa espécie de “divulgação interna”, aproveitando o espaço do próprio site. Além disso os links internos são excelentes em termos de SEO, já que ressaltam a importância de tais páginas.

Se você quiser criar uma lista de links para os posts mais recentes exclusivos de uma determinada categoria ou tag, saiba que é bem simples! Basta editar seu tema e incluir as chamadas no local desejado, basicamente passando alguns parâmetros para a função get_posts. Ela é detalhada no Codex.

A home do Explorando ficou assim, no caso, com links logo na entrada para os posts das categorias que quero destacar:

explorando destaque categorias

Listando os posts de determinada categoria do WordPress

O meu código (com a base pega no Codex) ficou simplesmente assim, adapte ao seu uso:

<ul>
<?php
global $post;
$args = array( 'numberposts' => 10, 'cat' => 31 );
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>

A parte que você deve alterar é essa linha:

$args = array( 'numberposts' => 10, 'cat' => 31 );

O valor 10 referente ao numberposts é o número de postagens recentes que serão pegas (no caso, 10 links, para os 10 últimos posts daquela categoria).

O ‘cat’ define a categoria, que deve ser colocada numericamente, pela ID dela. Para saber a ID vá em Posts > Categorias (página wp-admin/ edit-tags.php?taxonomy=category) e passe o mouse sobre a categoria desejada. A ID é exibida na URL no parâmetro tag_ID (você pode copiar a URL também, usando o menu popup que varia dependendo do navegador).

Por exemplo:

…wp-admin/edit-tags.php?action=edit&taxonomy=category&tag_ID=91&post_type=post

Veja que a ID no caso é 91.

Seria bom se desse para pegar pelo nome da categoria (slug), mas não procurei ainda função para isso. De qualquer forma isso é algo que você fará poucas vezes, então não custa ir buscar a ID da categoria ;)

Listando os posts de determinada tag no WordPress

Para tags é basicamente a mesma coisa, com a diferença que dá para puxar pelo slug da tag, bem mais prático:

<ul>
<?php
global $post;
$args = array( 'numberposts' => 10, 'tag' => 'windows-8' );
$myposts = get_posts( $args );
foreach( $myposts as $post ) : setup_postdata($post); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endforeach; ?>
</ul>

Veja que a parte que muda é basicamente essa:

'tag' => 'windows-8'

Ali fica o slug da tag, no caso “windows-8” (note o hífen).

Iniciantes: Onde colar estes códigos?

Para editar os templates você já deve ter algum conhecimento, certo?! Estes códigos podem ser colocados fora do loop, já que basicamente realizarão uma nova consulta ao banco de dados.

Se você quer que ele apareça antes da listagem de posts na página inicial, edite o arquivo do tema referente à página inicial, normalmente o index.php (mas pode ser home.php, front-page.php, etc, depende do tema).

Tome cuidado para não colocar o código dentro do loop que puxa os posts, pois se fizer isso a listagem será repetida a cada post na página inicial, gerando um efeito desastroso. O código do loop pode ser identificado por algo como:

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

Seria bom colocar o código da listagem dos posts da categoria ou tag desejada antes dessa linha if have posts while have posts…, assim a lista aparece imediatamente antes da listagem de posts. Um conhecimento mais específico de PHP e HTML/CSS será necessário para adaptar o visual ao seu gosto, o que não tenho como comentar aqui por motivos óbvios (cada tema é um tema distinto).

Se quiser destacar isso ao final dos artigos, você precisaria editar o arquivo das páginas individuais, como o single.php. Nesse caso recomendo colocar após o post, talvez depois dos comentários. Desconsiderando divergências entre os temas, procure por isso no single.php:

<?php comments_template(); >

E coloque o código do menu de posts recentes logo na linha depois dessa. Essa comments_template(); é a função que chama o sistema de comentários. Colocar o código depois dela fará com que a lista apareça depois do campo de comentários. Se colocar antes, naturalmente aparecerá antes :)

O link “ver mais” para a página da categoria que uso em alguns locais é simples, basta usar mais um <li>… manual no final da lista (fora do loop), imediatamente antes do </ul>

Lembre-se: FAÇA SEMPRE BACKUP DOS ARQUIVOS ANTES DE EDITÁ-LOS! Se algo der errado basta fazer upload da versão anterior e recomeçar as mudanças.

Observação sobre o uso de offset

Algumas referências a esse código podem sugerir o uso de ‘offset’ => 1 no array $args. Esse item faz com que o último post seja ignorado, ou seja, faz listar os mais recentes desconsiderando o último. Ele é ideal para blogs que exibem apenas um post na home, com links logo abaixo para os demais. Ficaria:

$args = array( 'numberposts' => 10, 'offset' => 1,  'tag' => 'windows-8' );

Note que você pode usar o mesmo código publicado logo mais acima para listar os posts recentes do blog, removendo se quiser o parâmetro da tag ou categoria.


Listar os posts mais recentes de determinada categoria é uma prática que venho usando em vários sites, e o retorno é positivo! Os leitores gostam, é bom para o site em termos de linkagem interna e tudo mais… Um outro site onde uso ativamente isso é meu site de dicas e mods para OMSI, um simulador de ônibus. Dado o tipo de site, esta função para pegar os posts de uma determinada categoria cai muito bem:

links categorias

Como dá para personalizar a saída como quiser, não é difícil aplicar isso em menus drop-down.

Enfim, vale a pena. Só tome cuidado para não fazer isso com muitas categorias ou tags de uma vez, já que serão feitas muitas chamadas no banco de dados, o que pode tornar a página mais lenta ainda (considerando que o WordPress já é “pesado”…). Se você usa plugins de cache o problema não deve ser tão perceptível.

Até pouco tempo eu usava a função fetch_rss ou fetch_feed para puxar os posts dos feeds das categorias ou tags (adicione /feed na URL das páginas de listagens do WordPress, caso use URLs amigáveis…). Por um problema que tive com ela (parou de funcionar só num site ao atualizar o WordPress) preferi ir direto ao ponto com a get_posts. Não parei para ver as diferenças de desempenho ainda.

publicidade
comments powered by Disqus

Comentários arquivados

  1. flaviano honorato escreveu

    Muito massa me ajudou bastante, porem tenho uma duvida:
    se eu quiser listar posts puxando de uma determinada categoria dinamicamente?

    tipo, estou na pagina LINUXl, e pego o id dessa pagina e listo todos os posts da categoria LINUX tambem

  2. escreveu

    Muito bom seu post, funcionou perfeitamente, só deixando minha contribuição eu queria usar o codigo num post e post não aceita php dai com a ajuda do PHP Code for Posts and Pages resolvi o problema, agora tou só com uma dúvida, teria como disponibilizar o codigo da categoria invertido
    pois assim é
    post 10
    post 9
    post 8

    e eu queria
    post 1
    post 2
    post 3
    se puder ajudar agradeço