Se você estiver usando várias consultas do WordPress para exibir diferentes conjuntos de posts, poderá encontrar conteúdo duplicado. Isso ocorre porque alguns posts podem corresponder a mais de um loop e aparecer duas vezes.
O WordPress não vem com uma opção integrada para evitar posts duplicados em múltiplos loops. No entanto, em nossos mais de 15 anos de experiência lidando com diferentes sites WordPress, aprendemos como evitar esse problema. Portanto, criamos um snippet de código personalizado que você pode adicionar ao seu site e evitar que posts duplicados sejam exibidos em diferentes loops.
Neste artigo, mostraremos como evitar facilmente a exibição duplicada de posts com múltiplos loops no WordPress.

Como Posts Duplicados Aparecem em Múltiplos Loops do WordPress
Ao criar um tema WordPress personalizado ou um modelo de página personalizado, você pode precisar usar múltiplos loops do WordPress.
Por exemplo, você pode querer mostrar seus posts recentes ao lado dos posts mais populares do seu site. Ao exibir todos os posts em cada categoria, você também pode ajudar os leitores a encontrar conteúdo interessante.
Em todos esses exemplos, um único post pode corresponder aos critérios para múltiplos loops. Quando isso acontece, o WordPress exibirá conteúdo duplicado.
Esse conteúdo duplicado pode fazer com que seu site pareça bagunçado e pouco profissional. Ele também ocupa espaço na tela sem adicionar valor.
Como você está gerando posts dinamicamente para cada loop, não é possível prever manualmente se um post duplicado aparecerá em vários loops.
Dito isso, vamos ver uma maneira fácil de evitar posts duplicados ao lidar com vários loops no WordPress.
Evitando Posts Duplicados em Múltiplos Loops do WordPress
Para este guia, mostraremos um código de exemplo do WordPress que causa o erro de post duplicado e, em seguida, compartilharemos um trecho de código que corrige o problema.
Ao criar um tema filho do WordPress ou um modelo personalizado, seu código pode ser completamente diferente. No entanto, você pode usar nosso trecho de código como ponto de partida e, em seguida, modificá-lo para se adequar ao seu próprio site.
Primeiro, vamos criar um problema de post duplicado. No código de exemplo a seguir, estamos exibindo todos os posts da categoria 'travel' e todos os posts da categoria 'news' sem evitar posts duplicados:
/****** The First Query *******/
$first_query = new WP_Query( array (
'category_name' => 'news',
'posts_per_page' => 3
));
// The Loop
if ( $first_query->have_posts() ) {
echo '<ul>';
while ( $first_query->have_posts() ) {
$first_query->the_post();
//display posts
echo '<li>';
echo the_post_thumbnail( array(50, 50) );
echo get_the_title();
echo '</li>';
}
echo '</ul>';
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
/****** The Second Query *******/
$second_query = new WP_Query( array (
'category_name' => 'travel',
'posts_per_page' => 3
) );
// The Loop
if ( $second_query->have_posts() ) {
echo '<ul>';
while ( $second_query->have_posts() ) {
$second_query->the_post();
echo '<li>';
echo the_post_thumbnail( array(50, 50) );
echo get_the_title();
echo '</li>';
}
echo '</ul>';
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
?>
Como você pode ver, este código não verifica posts duplicados em nenhuma query.
Se um post pertencer às categorias 'news' e 'travel', ele aparecerá duas vezes, como você pode ver na imagem a seguir.

Vamos corrigir esse problema.
Para evitar posts duplicados em seu blog WordPress, você precisará armazenar temporariamente os dados de todos os posts exibidos no primeiro loop.
Depois de ter essas informações, você pode modificar a segunda query para impedir que posts duplicados apareçam no segundo loop:
/****** The First Query *******/
$first_query = new WP_Query( array (
'category_name' => 'news',
'posts_per_page' => 3
) );
// The Loop
if ( $first_query->have_posts() ) {
echo '<ul>';
while ( $first_query->have_posts() ) {
$first_query->the_post();
// Store Post IDs in an Array to reuse later
$exclude[] = $post->ID;
//display posts
echo '<li>';
echo the_post_thumbnail( array(50, 50) );
echo get_the_title();
echo '</li>';
}
echo '</ul>';
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
/****** The Second Query *******/
$second_query = new WP_Query( array (
'category_name' => 'travel',
'post__not_in' => $exclude, // Tell WordPress to Exclude these posts
'posts_per_page' => 3
) );
// The Loop
if ( $second_query->have_posts() ) {
echo '<ul>';
while ( $second_query->have_posts() ) {
$second_query->the_post();
echo '<li>';
echo the_post_thumbnail( array(50, 50) );
echo get_the_title();
echo '</li>';
}
echo '</ul>';
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
?>
No código acima, estamos armazenando os IDs dos Posts em um array chamado $exclude. Depois disso, estamos adicionando o argumento post__not_in à segunda query, que excluirá os posts que foram exibidos no primeiro loop.
Se você não está familiarizado com a adição de trechos de código ao seu site, uma maneira mais fácil é usar o WPCode. É o melhor plugin de trechos de código para WordPress que ajuda você a adicionar código personalizado sem o risco de quebrar seu site.
Primeiro, você precisará instalar e ativar o plugin WPCode. Se precisar de ajuda, consulte nosso guia sobre como instalar um plugin do WordPress.
Após a ativação, você pode ir para Trechos de Código + Adicionar Trecho no painel do WordPress e, em seguida, clicar na opção ‘Adicionar Seu Código Personalizado (Novo Trecho)’.

Depois disso, você pode colar o código personalizado na área de Visualização de Código e inserir um título no topo.
Você também precisará selecionar o ‘Tipo de Código’ como Trecho PHP clicando no menu suspenso.

Após inserir o código, basta rolar para baixo para selecionar a seção de Inserção.
Aqui, você pode usar a configuração padrão de ‘Inserção Automática’ e deixar o plugin adicionar o código automaticamente ao seu site.

Assim que terminar, basta salvar o trecho e ativá-lo.
Para mais detalhes, consulte nosso guia sobre como adicionar código personalizado no WordPress.
Agora, se você visitar seu site WordPress, verá que as postagens duplicadas desapareceram.

Esperamos que este artigo tenha ajudado você a aprender como evitar a exibição de postagens duplicadas com vários loops no WordPress. Você também pode consultar nosso guia sobre como desativar qualquer número de postagens em um loop do WordPress e como tornar postagens fixas no WordPress.
Se você gostou deste artigo, por favor, inscreva-se em nosso Canal do YouTube para tutoriais em vídeo do WordPress. Você também pode nos encontrar no Twitter e no Facebook.


Nick J
Existe algum plugin que faça isso?
Satriyo
Alguém poderia me dizer como fazer isso? Sou muito novo nisso e preciso de ajuda, por favor, me dê um exemplo claro com o ID da postagem, como armazená-lo? Digamos que o meu seja 1527.
Gaurav
Estou executando 2 loops antes de loops de uma categoria específica na qual eu gostaria de evitar duplicatas. Então, como armazeno os IDs no array dos dois primeiros loops?
Joe
Era exatamente o que eu estava procurando – obrigado!
Guilherme Alves
Muito obrigado :))) Isso me ajuda muito!
Salvou meu dia <3
WPBeginner Support
Olá Guilherme,
You are welcome
Don’t forget to follow us on Facebook for more WordPress tips and tutorials.
Admin
Julie
AWESOME!! Thank you so much! And thank you SERGEYVLASOV for that last comment– Worked like a charm for my multiple loops. Hooray!!
Pirooz
Este método funciona bem até que ambos os 2 loops estejam em um arquivo.
mas quando coloco o primeiro loop no header.php e outro no index.php,
in_array($post->ID, $do_nit_duplicate) retorna nulo.
O que posso fazer?
warren
Boa tarde a todos,
isso funcionará para o meu problema atual com a exibição duplicada de posts no site? ele literalmente exibe uma cópia sob os posts e o botão 1, 2, ->
o site é Desativei e reativei plugins, estou literalmente ficando louco.
agus
você pode me ajudar?
Eu tenho um problema com categorias duplicadas no meu site
por favor
#obrigado
WPBeginner Support
Parece um problema específico do tema, entre em contato com os desenvolvedores do tema para obter suporte.
Admin
Gabriel
Antes de iterar sobre o loop padrão, não deveríamos usar wp_reset_postdata(); ?
Greg
@sergeyvlasov – Obrigado, funcionou para mim
embora eu tenha mudado
$do_nit_duplicate para $do_not_duplicate
Ron Hantman
Confira esta solução que faz esta tarefa fora do loop:
http://wordpress.stackexchange.com/questions/61936/removing-duplicate-values-between-two-wordpress-queries/
sergeyvlasov
Acho que há uma falha neste algoritmo. Ele não consegue detectar mais de 1 (uma) duplicação. Então a linha mágica seria
$do_not_duplicate[] = $post->ID
e então usada como
if(in_array($post->ID, $do_nit_duplicate)) continue;