BlogAjuda

Dicas, temas e informações sobre WordPress, blogosfera brasileira e monetização.

Query Posts: personalizando as páginas do WordPress

Rodrigo P. Ghedin WordPress

Hoje abordarei um assunto complexo, mas que, quando entendido, expande o nível de personalização do WordPress a patamares inimagináveis. A mágica é conseguida através do recurso query posts. Não sei o porquê deste nome, nem como funciona tecnicamente; só sei que é útil, e ao contrário do que parece à primeira vista, é fácil de usar.

Aos que entendem o idioma do tio Sam, recomendo a leitura deste artigo da Codex, extremamente detalhado e que serviu de base para este que você está lendo.

Através da (ou seria do?) query posts, é possível fazer, diretamente no sistema, alterações possíveis através da URL e/ou das opções, porém sem mudá-las. Há inúmeras possibilidades de uso, graças às diversas variáveis suportadas. Destaco algumas:

  • Exibir uma página ou um post na página inicial;
  • Exibir todos os posts e páginas publicados em determinado período;
  • Exibir apenas o último post na página inicial;
  • Alterar a ordem de exibição dos posts;
  • Exibir posts apenas de uma só categoria.

No decorrer do artigo, usarei exemplos práticos para ilustrar e facilitar a compreensão das hipóteses.

Antes de tudo, é necessário identificar o loop. O loop é um trecho existente nos arquivos que exibem diversos posts simultaneamente, como o index.php, category.php, archive.php e search.php. Este trecho é o responsável por ir ao banco de dados, e puxar os dados dos posts, exibindo-os ordenadamente e através do código escrito dentro dele. Veja um exemplo de loop:

<ul>
<?php if (have_posts()) : ?>

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

<li class=”lista_noticias”><span class=”data”><?php the_time(’d/m/y’) ?></span> <a href=”<?php the_permalink() ?>”><?php the_title(); ?></a> <small><a href=”<?php the_permalink() ?>#comments” title=”Comentários”><em>(<?php comments_number(’0′,’1′,’%'); ?>)</em></a></small></li>

<?php endwhile; ?>
</ul>

<p class=”esquerda”><a href=”/category/noticias/”>Mais notícias…</a></p>

<?php else : ?>

<h2 class=”center”>Not Found</h2>

<p class=”center”>Sorry, but you are looking for something that isn’t here.</p>

<?php include (TEMPLATEPATH . “/searchform.php”); ?>

<?php endif; ?>

Vamos tentar entendê-lo?

Encontrou as tags <ul> e </ul>? Abaixo da primeira tem início o loop (<?php if (have_posts()) : ?>), que termina exatamente acima da segunda (<?php endwhile; ?>). O que vem abaixo da tag <?php else : ?> é uma espécie de quebra-galho. Falando em bom português, caso nenhum artigo seja encontrado no banco de dados, a famigerada mensagem de desculpas aparecerá.

No navegador, o código acima retorna o seguinte resultado:

Resultado do código.

Porém, aquele código não é tudo. Nas configurações do blog, está marcado, no item Show at most, dez posts. Isso significa que o WordPress deve exibir, em cada página de índice, como a mostrada acima, dez textos, ou no caso, dez headlines. Além disso, no exemplo acima só estão listados posts de uma categoria; o blog em questão tem catorze. Sim, caro leitor, o responsável por essa customização é a query post.

Agora que você já sabe que o loop se inicia na linha <?php if (have_posts()) : ?> (ou qualquer coisa parecida com isso), abra o editor de temas do seu blog e navegue até uma das páginas já mencionadas que o contêm. Localizado o início do loop, insira, imediatamente antes dele, a seguinte tag:

<php query_posts() ?>

Simples, não? Sim, é simples mesmo. O uso de query post é exatamente este: inserir a tag antes do início do loop. Evidente que, do modo como ela está mostrada ali em cima, não produzirá efeito algum. É aí que entram os atributos da query post. Vejamos um exemplo prático, pegando o gancho explicado acima (vinte e cinco posts, e apenas a categoria 1); o código seria este:

<?php query_posts('posts_per_page=25&cat=1'); ?>

Entendeu o funcionamento? O atributo posts_per_page=25 diz ao sistema para que ele retorne os vinte e cinco últimos textos, e o cat=1 limita a exibição somente à categoria cuja ID é 1. O & não tem função definida, serve apenas para fazer com que dois ou mais atributos sejam interpretados simultaneamente.

Dito isto, e dentro dos atributos disponíveis, as possibilidades são inúmeras! Vejamos mais alguns exemplos:

  • <?php query_posts('cat=3&year=2004'); ?>
    Este código exibirá posts da categoria cuja ID é 3 que foram publicados no ano de 2004.
  • <?php query_posts('order=ASC&posts_per_page=12&author=3') ?>
    Exibirá os posts em ordem invertida, exibindo apenas doze por página, e apenas os de autoria do usuário cujo ID é 3.
  • <?php query_posts('page_id=7') ?>
    Exibirá, ao invés de posts, apenas a página cujo ID é 7.

Lembrando que o ID é um número que é atribuído a todos os posts, páginas, categorias e autores. Na área Manage, do painel administrativo, é possível identificar o ID de tudo isso que foi citado.

Farei, brevemente, uma listagem dos atributos que conheço. Acompanhe:

  • p=1
    Usado para exibir determinado post, através do ID;
  • name=first-post
    A mesma função do anterior, mas obtém o post através do post slug (nome na URL; ainda abordarei este assunto num texto futuro);
  • page_id=7
    Novamente, a mesma utilidade, mas ao invés de posts, este atributo busca uma página, pelo ID;
  • pagename=about
    Idem, mas através do post slug da página;
  • showposts=1
    Tem a mesma finalidade do atributo posts_per_page;
  • author=3
    Exibe apenas posts do usuário cujo ID seja 3;
  • author_name=Harriet
    Mesma função do atributo anterior, mas busca o usuário através do nome, e não do ID;
  • hour=11
    Mostra apenas posts publicados em determinada hora;
  • minute=59
    Mostra apenas posts publicados em determinado minuto;
  • second=30
    Mostra apenas posts publicados em determinado segundo;
  • day=15
    Mostra apenas posts publicados em determinado dia;
  • monthnum=12
    Mostra apenas posts publicados em determinado mês;
  • year=2005
    Mostra apenas posts publicados em determinado ano;
  • order=ASC
    Mostra posts na ordem correta (para exibir ao contrário, substitua ASC por DESC).
  • cat=1
    Limita a exibição de posts somente à categoria cuja ID é 1. Usando o número negativo, ou seja, precedido de um hífen (-1), exibe todas as categorias, menos a cuja ID é 1.

Ufa, é realmente bastante coisa. E há mais, acredite! Só com a ajuda das query posts é possível transformar o WordPress, nativamente um sistema de blogs, em um portal completo. Veja um exemplo.

O artigo original, já mencionado, se não for mais completo, é mais direto, e traz vários exemplos práticos, uns bem desenvolvidos, utilizando técnicas cujas quais eu não domino (e, portanto, não abordei aqui). Vale a pena dar uma olhada.

Este é um assunto muito procurado nos fóruns de suporte em que participo. Espero, com este texto, ter sanado o básico, e aberto caminho para seus estudos. Teste, erre, improvise, arrisque: o resultado vem, pode apostar.

24 comments

Muito boa a explicação, dá pra fazer praticamente tudo com o Wordpress. Com esse seu texto dá pra tirar da cabeça de muita gente que o Wordpress é só para blogs!!!

Posted by Pedro Rogério
September 23rd, 2006, às 2:02 pm. #.

Muito bom! parabéns

Posted by Thalis Valle
September 26th, 2006, às 11:39 pm. #.

Cara, não acho às tags no index.php, nem nos outros, olhe como está meu index.php:

INDEX.PHP

“>
” rel=”bookmark” title=” “>
“>

|

Aguardo retorno!

Posted by William
October 3rd, 2006, às 8:39 pm. #.

Puxa, Ro, valeu pelas dicas, ainda mais quando decido ‘ler poesias’ para deixar meu blog bem legal. Vai ajudar bastante ;)

bjsss

Posted by Cris Zimermann
October 3rd, 2006, às 10:41 pm. #.

É… Meu comentário foi cortado! :|
De qualquer maneira, consegui! :D

Posted by William
October 13th, 2006, às 12:14 am. #.

é Tentei inserir o codigo citado para que os posts fossem mostrados como demonstra a imagem, mais não consegui.

Inseri o codigo disponivel e um erro apareceu,tenho que alterar algo no codigo?

Queria que os posts fossem mostrados como na imagem
(Data)-Titulo linkado para o post.

e agora?

Posted by Everton
December 29th, 2006, às 5:52 pm. #.

vlw¬¬

Posted by Everton
January 4th, 2007, às 2:39 pm. #.

Ghedin,

O nome é query_posts pq esse código gera uma query no MySql, que é responsável por fazer a busca.

Esse query_post é como se fosse um “select * from noticias where author=3″ por exemplo.

Abs!

Posted by Tonobohn
January 11th, 2007, às 10:08 pm. #.

[…] informar que não vou reinventar a roda. Existe um ótimo artigo escrito pelo Rodrigo Ghedin no Blogajuda. Quero fazer aqui apenas algumas observações para o uso desta poderosa tag. A forma de uso está […]

Posted by Um pouco mais de query_posts() at wp help
February 4th, 2007, às 3:43 am. #.

é meio complicado até conseguir configurar,mais vale a pena

Posted by Everton
March 24th, 2007, às 7:52 pm. #.

[…] Artigo Orignal […]

Posted by Blog Way » Blog Archive » Query Posts: personalizando as páginas do WordPress
April 2nd, 2007, às 9:09 pm. #.

keep up the good work!.

Posted by Bush
April 7th, 2007, às 6:23 pm. #.

Have this:t

Posted by Albert
April 25th, 2007, às 2:43 am. #.

Puxa, eu já criei um tema novo para meu website e estou trabalhando na “personalização” das páginas, fixei uma página estática chamada e home para a página inicial, e gostaria de colocar os 2 últimos posts como “Novidades” ou “Noticias” tanto faz. Eu queria colocar os posts normal, com título, data e resumo… mas quando insiro o código no editor do wordpress dá erro, ele não interpreta o php, e eu instalei o runphp.

Se tiver como me ajudar de alguma forma, agradeço! :)

Posted by Areta do Bem
May 3rd, 2007, às 4:09 pm. #.

[…] 10 posts por página e somente da categoria 2). Caso queira saber mais sobre queryposts acesse este link, muito […]

Posted by Um site muito bom, o Fowtec.com!
December 13th, 2007, às 2:05 pm. #.

oi rodrigo. legal o post. eu estou montando um site com o word press e me deparei com um problema. nas opções de leitura eu escolhi a página “perfil” (estática) para ser visuallizada como página inicial. porém, com isso a “home”, que tem os posts também está mostrando o cónteúdo da página ‘perfil’. então é como se tivessem 2 páginas ‘perfil’ e a ‘home’ não mostra mais os posts. como arrumo isso? achei que fosse do tema, pra ver se era diferente a index.php da page.php mas mesmo com outros temas isso se repete. na verdade eu preciso manter a perfil como a inicial, mas também preciso que a home mostre os posts…
se puder ajudar, agradeço desde já!
valeu! e parabéns pelos posts!!

Posted by marcelo araujo
March 11th, 2008, às 11:39 am. #.

Marcelo Araújo, desculpa me meter, mas acho que isso pode lhe ajudar:
http://pt-br.forums.wordpress.com/topic.php?id=223&replies=2#post-573

Posted by João Grando
March 18th, 2008, às 11:47 am. #.

Grande João Grando!! deu certo! valeu demais!!!
outra solução que encontrei é ir no arquivo ‘header.php’ ou cabeçalho e tirar na mão mesmo o link home, caso queira desativá-lo.
Mas sua solução é mais fácil.
Abraço!!

Posted by marcelo araujo
March 18th, 2008, às 12:38 pm. #.

Posso inserir esse código php (query_post) direto na caixa de HTML da uma página que eu criei , por exemplo Lista de arquivos com a tag “tal”, ou tenho que criar especificamente um arquivo php e utilizar o include? Sabe me dizer?

Posted by Edmundo
March 19th, 2008, às 4:16 pm. #.

Cara…viajei total!!!

já coloquei tag query ante do loop assim:

mas onde eu insiro essa tag:

essa é a duvida!!

Posted by Filipe Frade
March 27th, 2008, às 5:40 pm. #.

oxmeqr fdaslgvk txcgfr deyb ucjpnl brpyucixt jlhd

Posted by clqdnage acrqjn
June 20th, 2008, às 10:51 pm. #.

watch tom we cube speed key night greed america keyboard girl

Posted by stonemangree
June 27th, 2008, às 2:01 pm. #.

english england frog white night mail

Posted by womanwaterfr
July 8th, 2008, às 10:53 am. #.

black elephant jhon right student juicy

Posted by oceanwoodwom
September 2nd, 2008, às 10:01 pm. #.

Leave a comment!



Message



BlogAjuda © 2007.

Simple Grey theme developed by Rodrigo P. Ghedin.

WordPressFAMFAMFAM