Marcelo Mesquita

Apenas mais um desenvolvedor WordPress

Evitando posts repetidos

Quando começamos a trabalhar com Múltiplos Loops, um detalhe importante, muito bem lembrado pelo David, é quanto aos posts repetidos. É possível que os diferentes Loops tenham algum post em comum e esse post 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:

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

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:

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

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

Qualquer dúvida é só avisar.

7 Comments

  • responder

    David

    9 anos atrás

    Valeu Marcelo, eu tinha dificuldades em entender esse processo, de como funcionava, mas agora, perfeito. Agora ta ‘mamão com açucar’, hhehehe.

    Valeu, e obrigado mais uma vez.

  • responder

    David

    8 anos atrás

    Tudo bem Marcelo,
    Andei observando que este código incluido somente na index de um site, ou na sidebar, funcionar perfeitamente, mas quando inserido na index e na sidebar gera duplicação de post, mesmo usando um array de mesma nome.

    Como resolver isso,

    Desde já agradeço a atenção

  • responder

    Redirect

    8 anos atrás

    Marcelo, excelente esse seu artigo. Só me tire uma dúvida: esse sistema funciona no WordPress 2.9.2? Irá funcionar na futura versão 3 dele?

    Obrigado, e parabéns.

  • responder

    Maclei

    7 anos atrás

    Marcelo, usei a solução do Smashing Magazine e funcionou direitinho. Mas queria listar 10 posts, como faço isso? Experimentei alterar o query_posts mas não consegui colocar o showposts para funcionar junto com a solução do Smashing Magazine.

    • responder

      Marcelo Mesquita

      7 anos atrás

      Oi Maclei,
      basta passar todos os parâmetros como um array. Por exemplo:
      $query_array[ ‘post__not_in’ ] = $useds;
      $query_array[ ‘showposts’ ] = 10;
      $news = new WP_Query( $query_array );

      Abraço.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *