Back-End

25 nov, 2009

Personalizando o Loop

Publicidade

Para quem desenvolve em WordPress o mais importante é entender como funciona o loop, a estrutura responsável por carregar os posts no WordPress. Ele funciona em todos os templates do tema, por isso é tão importante. O que alimenta a consulta do loop são os parâmetros
passados no endereço do site, carregados cronologicamente por padrão.

Por exemplo: Ao acessar o endereço http://www.dominio.com/?cat=1,
estaremos passando para o loop cuja categoria é igual a 1, assim, o
loop irá carregar os posts que estejam dentro dessa categoria apenas.

Todos os resultados obtidos com a consulta são armazenados em um
array chamado $posts e a cada volta do loop a chave do array é
incrementada. Dessa forma, precisamos somente de uma estrutura de
repetição que monte o conteúdo de cada post dentro da nossa interface.
Para facilitar ainda mais, o WordPress disponibiliza duas funções que
fazem quase todo o trabalho para nós, são elas:

  • have_posts(), que verifica se ainda existem posts no array; e
  • the_post(), que carrega os dados do post da vez.

A estrutura mais utilizada nos temas do WordPress é:

<?php while(have_posts()) : the_post(); ?>
trecho da interface a ser repetido...
<?php endwhile; ?>

Traduzindo para o programês, ficaria assim:

<?php enquanto(houverem_posts()) : carregue_o_post_da_vez(); ?>
trecho da interface a ser repetido...
<?php verifique_se_ainda_há_posts; ?>

Dentro do loop estarão disponíveis os atributos do post da vez,
esses atributos podem ser acessados utilizando as funções the_title(),
the_permalink(), the_content(), para citar algumas. Sabendo disso, para
montar um template que mostre o título, o autor e a data de publicação
de um post precisaríamos simplesmente adicionar as respectivas funções
nos locais apropriados. Segue mais um exemplo:

<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<p class="data"><?php the_time(); ?></p>
<p class="autor"><?php the_author(); ?></p>
<?php endwhile; ?>

Personalizando

Após entender como o Loop
funciona, já podemos começar a brincar com o WordPress controlando o
conteúdo a ser carregado ou filtrado. Mais uma vez o WordPress facilita
a vida dos desenvolvedores disponibilizando a função query_posts().

Essa função permite criar parâmetros de consulta ou adicionar novos
parâmetros aos passados via endereço do navegador, dessa forma você
pode excluir uma categoria da pesquisa, reordenar os posts, limitar a
quantidade de resultados, entre outras coisas.

O funcionamento do query_posts é simples, apenas adicione a função
‘query_posts(‘args’)’ antes da função ‘have_posts()’ substituindo o
args pelos argumentos desejados à sua consulta. Dessa forma o
‘have_posts()’ irá ignorar os parâmetros passados pelo endereço e fará
uma consulta baseada nos dados informados. Por exemplo, se você quer
listar três posts aleatórios da categoria ‘destaques’, o script seria
assim:

<?php query_posts("&orderby=rand&showposts=3&category_name=destaques"); ?>
<?php while(have_posts()) : ?>
trecho da interface a ser repetido...
<?php endwhile; ?>

Note que cada atributo é separado pelo & assim como nos
parâmetros passados via url. Dessa forma os desenvolvedores se sentem
mais familiarizados com o código e não precisam ficar decorando a ordem
dos atributos nem se preocupar em anular os que não serão usados.

Caso a sua intenção seja apenas filtrar os resultados de uma busca,
adicione a variável ‘$query_string’ à sua função query_posts, dessa
forma o WordPress mescla os seus argumentos com os argumentos da
página. Essa variável é muito importante quando você pretende manter a
navegabilidade, como é o caso dos resultados de uma pesquisa ou do
conteúdo da página inicial do site. Para exemplificar, segue como seria
o script para retirar uma categoria dos resultados de uma pesquisa:

<?php query_posts("{$query_string}&cat=-3"); ?>
<?php while(have_posts()) : ?>
trecho da interface a ser repetido...
<?php endwhile; ?>

Esse script deve ficar no arquivo search.php, então os posts
encontrados na categoria 3 não aparecerão nos resultados das pesquisas
e a paginação dos resultados continuará funcionando.