Försöker du fixa duplicerade posts som visas med flera slingor i WordPress?
Om du använder flera WordPress-sökningar för att visa olika uppsättningar av posts, kan du stöta på duplicerat content. Detta beror på att vissa posts kan matcha mer än en slinga och visas två gånger.
I den här artikeln kommer vi att visa dig hur du enkelt kan undvika att duplicerade post visas med flera loopar i WordPress.
Så här visas Duplicator-poster i flera WordPress-slingor
När du skapar ett custom WordPress theme eller en custom page template kan du ibland behöva använda flera WordPress loops.
Du kanske till exempel vill visa de senaste inläggen bredvid de mest populära inläggen på din site. Genom att visa alla posts i varje kategori kan du också hjälpa läsarna att hitta intressant content.
I alla dessa exempel kan ett enskilt inlägg matcha kriterierna för flera slingor. När detta händer kommer WordPress att visa duplicerat content.
Detta duplicerade content kan få din site att se rörig och oprofessionell ut. Det tar också upp utrymme på skärmen utan att tillföra värde.
Eftersom du dynamiskt genererar posts för varje loop kan du inte manuellt förutsäga om ett duplicerat post kommer att visas i flera loopar.
Med detta sagt, låt oss titta på ett enkelt sätt att undvika duplicerade posts när vi hanterar flera loopar i WordPress.
Undvik duplicerade posts i flera WordPress-slingor
I den här guiden kommer vi att visa dig några exempel på WordPress-kod som orsakar duplicate post error och sedan dela ett code snippet som fixar problemet.
När du skapar ett WordPress barntema eller en custom template kan din kod vara helt annorlunda. Du kan dock använda vårt code snippet som utgångspunkt och sedan ändra det så att det passar din egen website.
Låt oss först skapa en duplicate post issue. I följande exempelkod visar vi alla posterna i kategorin ”travel” och alla posterna i kategorin ”news” utan att undvika dubbla postningar:
/****** 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();
?>
Som du kan se kontrollerar den här koden inte för duplicerade poster i någon av sökningarna.
Om ett post tillhör både kategorin ”news” och ”travel” kommer det att visas två gånger, som du kan se i följande image.
Låt oss fixa den här issue.
Order: För att undvika dubbla inlägg på din blogg i WordPress måste du tillfälligt lagra data om alla de posts som visas i den första loopen.
När du har den informationen kan du ändra den andra sökningen för att stoppa duplicerade poster från att visas i den andra slingan:
/****** 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();
?>
I koden ovan lagrar vi ID:n för posterna i en array som heter $exclude
. Därefter lägger vi till argumentet post__not_in
i den andra sökningen, vilket kommer att utesluta posts som visades i den första loopen.
Om du inte är bekant med att lägga till code snippets till din site, så är ett enklare sätt att använda WPCode. Det är det bästa code snippet plugin för WordPress som hjälper dig att add custom code utan att riskera att bryta din site.
Först måste du installera och aktivera pluginet WPCode. Om du behöver hjälp, vänligen se vår guide om hur du installerar ett plugin för WordPress.
Efter aktivering kan du gå till Code Snippets + Add Snippet från WordPress dashboard och sedan klicka på alternativet ”Add Your Custom Code (New Snippet)”.
Efter det kan du klistra in den anpassade koden i Code Preview area och ange en titel högst upp.
Du måste också välja ”Code Type” som PHP Snippet genom att clicka på dropdown-menyn.
När du har enter koden rullar du bara nedåt för att select the Section Infogaren.
Här kan du använda standardinställningen ”Auto Insert” och låta pluginet automatiskt lägga till koden på din site.
När du är klar sparar du bara snippet och aktiverar det.
För mer details, vänligen se vår guide om hur du lägger till custom code i WordPress.
Om du nu besöker din WordPress website kommer du att se att de dubbla posterna har försvunnit.
Vi hoppas att den här artikeln hjälpte dig att lära dig hur du undviker duplicerad displayed av post med flera loopar i WordPress. Du kanske också vill se vår guide om hur man väljer den bästa webbdesignprogramvaran eller vårt expertval av de bästa drag and drop WordPress page builders.
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.
Administratör
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.
Administratör
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;