Quarta-feira, 11 de novembro de 2009 às 11h00

Evitando posts repetidos

Faça o curso: jQuery na Prática

Quando começamos a trabalhar com Múltiplos Loops, um detalhe importante é quanto aos posts repetidos. É possível que os diferentes Loops tenham algum post em comum e ele acabe sendo duplicado em algum momento.

Para evitar que isso aconteça, existe uma solução simples, a instrução 'continue' do php. Essa instrução pula a iteração atual dentro de uma estrutura de loop, no nosso caso o 'while'. Mas antes precisamos saber quais iterações devem ser puladas, portanto criamos um array para armazenar o 'id' dos posts que já foram apresentados e em seguida filtramos esses posts. Com isso teremos:

<?php $usados = array(); ?>
<?php $noticias = new WP_Query("category_name=noticias&showposts=3"); ?>
<?php while($noticias->have_posts()) : $noticias->the_post(); ?>
<?php array_push($useds, $post->ID); ?>
trecho da interface a ser repetido...
<?php endwhile; ?>
 
<?php $artigos = new WP_Query("category_name=artigosamp;showposts=3"); ?>
<?php while($artigos->have_posts()) : $artigos->the_post(); ?>
<?php if(in_array($post->ID, $usados)) continue; ?>
<?php array_push($useds, $post->ID); ?>
trecho da interface a ser repetido...
<?php endwhile; ?>

Explicando os trechos destacados: antes de tudo, criamos um array de nome $usados. No primeiro loop, a cada iteração, adicionamos o id do post da vez no array. E, finalmente, nos loops consecutivos, verificamos se o post da vez já foi usado antes de carregar o seu conteúdo.

No bom programês, seria algo como:

<?php $usados = lista(); ?>
<?php $noticias = consulte_posts("quantidade_de_posts=3 e categoria_de_nome=noticias"); ?>
<?php enquanto(houverem_posts_em_noticias()) : carregue_o_post_da_vez(); ?>
<?php adicionar_na_lista_dos_usados($id_do_post); ?>
trecho da interface a ser repetido...
<?php verifique_se_ainda_há_posts; ?>
 
<?php $artigos = consulte_posts("quantidade_de_posts=3 e categoria_de_nome=artigos"); ?>
<?php enquanto(houverem_posts_em_artigos()) : carregue_o_post_da_vez(); ?>
<?php se(na_lista_dos_usados_houver($id_do_post)) pular_iteração; ?>
<?php adicionar_na_lista_dos_usados($id_do_post); ?>
trecho da interface a ser repetido...
<?php verifique_se_ainda_há_posts; ?>

Caso seu template tenha mais de dois loops, basta repetir a estrutura do segundo loop.

Qualquer dúvida é só avisar.

2 comentários

 Pablo Almeida
11/11/2009 14h39

Legal e interessante...

Só acho que o código poderia estar um pouco mais enxuto. Não tem porquê abrir tantas tags de PHP (<?php ?>). WordPress: Code is poetry! ;)

Legal sua dica, Marcelo!

Valeu!

 Marcelo Mesquita
12/11/2009 22h38

Code is poetry!

Concordo Pablo, "code is poetry!". No exemplo acima eu removi as tags html que ficavam entre as várias tags php para facilitar o entendimento e preferi manter todos os <?php ?> pois se alguém aproveitar o código não terá que recria-las.

Abraço.

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Marcelo Mesquita é formado em Desenvolvimento de Sistemas para a Web e há mais de cinco anos trabalha com desenvolvimento de sites. Nos últimos dois anos tem seu foco no WordPress: montagem de temas, desenvolvimento de plugins, scripts, widgets e performance.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.