Essayez-vous de corriger l’affichage des publications en double avec plusieurs boucles dans WordPress ?
Si vous utilisez plusieurs requêtes WordPress pour afficher différents types de publications, vous risquez de rencontrer du contenu dupliqué. En effet, certaines publications peuvent correspondre à plus d’une boucle et apparaître deux fois.
Dans cet article, nous allons vous afficher comment éviter facilement l’affichage de publications en double avec plusieurs boucles dans WordPress.
Comment les publications Duplicator apparaissent dans plusieurs boucles WordPress
Lors de la création d’un thème WordPress personnalisé ou d’un modèle de page personnalisé, vous devrez parfois utiliser plusieurs boucles WordPress.
Par exemple, vous pouvez afficher vos publications récentes à côté des publications les plus populaires de votre site. Vous pouvez également aider les Lecteurs à trouver un contenu intéressant en affichant toutes les publications de chaque catégorie.
Dans tous ces exemples, une publication unique peut correspondre aux critères de plusieurs boucles. Dans ce cas, WordPress affiche un contenu en double.
Ce contenu dupliqué peut donner à votre site un aspect désordonné et non professionnel. Il occupe également de l’espace à l’écran sans apporter de valeur ajoutée.
Étant donné que vous générez dynamiquement des publications pour chaque boucle, vous ne pouvez pas prévoir manuellement si une publication dupliquée apparaîtra dans plusieurs boucles.
Ceci étant dit, voyons un moyen facile d’éviter les publications en double lorsqu’il s’agit de boucles multiples dans WordPress.
Éviter les publications Duplicator dans plusieurs boucles WordPress
Pour ce guide, nous allons vous montrer un exemple de code WordPress qui provoque l’erreur de publication en double et ensuite afficher un extrait de code qui corrige le problème.
Lors de la création d’un thème enfant WordPress ou d’un modèle personnalisé, votre code peut être complètement terminé. Cependant, vous pouvez utiliser notre extrait de code comme point de départ, puis le modifier pour l’adapter à votre propre site.
Tout d’abord, créons un problème de publication en double. Dans l’exemple de code suivant, nous affichons toutes les publications de la catégorie « voyages » et toutes les publications de la catégorie « nouvelles » sans éviter les doublons.
/****** 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();
?>
Comme vous pouvez le constater, ce code ne vérifie pas la présence de publications en double dans l’une ou l’autre requête.
Si une publication appartient à la fois à la catégorie « nouvelles » et à la catégorie « voyages », elle apparaîtra deux fois, comme vous pouvez le voir dans l’image suivante.
Corrigeons ce problème.
Afin d’éviter les publications en double sur votre blog WordPress, vous devrez stocker temporairement les données relatives à tous les articles affichés dans la première boucle.
Une fois que vous disposez de ces informations, vous pouvez modifier la deuxième requête pour empêcher les publications en double d’apparaître dans la deuxième boucle :
/****** 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();
?>
Dans le code ci-dessus, nous stockons les ID de publication dans un tableau appelé $exclude
. Ensuite, nous ajoutons l’argument post__not_in
à la deuxième requête, ce qui exclura les publications qui ont été affichées dans la première boucle.
Maintenant, si vous visitez votre site WordPress, vous verrez que les publications en double ont disparu.
Nous espérons que cet article vous a aidé à apprendre comment éviter l’affichage de publications en double avec plusieurs boucles dans WordPress. Vous pouvez également consulter notre guide sur la façon de choisir le meilleur logiciel de conception de sites Web ou voir notre choix d’experts des meilleurs constructeurs de pages WordPress en drag and drop.
If you liked this article, then please subscribe to our YouTube Channel for WordPress video tutorials. You can also find us on Twitter and Facebook.
Syed Balkhi says
Hey WPBeginner readers,
Did you know you can win exciting prizes by commenting on WPBeginner?
Every month, our top blog commenters will win HUGE rewards, including premium WordPress plugin licenses and cash prizes.
You can get more details about the contest from here.
Start sharing your thoughts below to stand a chance to win!
Nick J says
Is there a plugin that does this?
Satriyo says
Could someone tell me how to do this? I’m really new to this and need a help, please give me a clear example with the post ID, how to store it? Let’s say, mine is 1527.
Gaurav says
I’m running 2 loops before loops of a specific category in which I would like to avoid duplicates. So how do a store ID’s in the array from first two loops?
Joe says
Just what I was looking for – thank you!
Guilherme Alves says
Thank you soo much :))) This helps me alot!
Save my day <3
WPBeginner Support says
Hi Guilherme,
You are welcome Don’t forget to follow us on Facebook for more WordPress tips and tutorials.
Administrateur
Julie says
AWESOME!! Thank you so much! And thank you SERGEYVLASOV for that last comment– Worked like a charm for my multiple loops. Hooray!!
Pirooz says
This method just works fine until both of 2 loops located in one file.
but when I put the first loop in the header.php and another one in the index.php,
in_array($post->ID, $do_nit_duplicate) returns null.
what can I do?
warren says
Good afternoon all,
will this work for my current issue with double display of posts on site? it literally displays a copy under the posts and the 1, 2, -> button…
the site is I have deactivated re-activated plugins i am literally going nuts.
agus says
can you help me?
I have proble with duplicate category in my site
please
#thanks
WPBeginner Support says
Seems like a theme specific issue, contact theme developers for support.
Administrateur
Gabriel says
Before iterating over the default loop shouldn’t we use wp_reset_postdata(); ?
Greg says
@sergeyvlasov – Thanks that worked for me
tho i changed
$do_nit_duplicate to $do_not_duplicate
Ron Hantman says
Checkout this solution which does this task outside of the loop:
http://wordpress.stackexchange.com/questions/61936/removing-duplicate-values-between-two-wordpress-queries/
sergeyvlasov says
I think there is a flaw in this algorithm. It can spot no more than 1(one) duplication. So the magic line would look like
$do_not_duplicate[] = $post->ID
and then used as
if(in_array($post->ID, $do_nit_duplicate)) continue;