Jeśli używasz wielu zapytań WordPress do wyświetlania różnych zestawów postów, możesz napotkać zduplikowane treści. Dzieje się tak, ponieważ niektóre posty mogą pasować do więcej niż jednej pętli i pojawić się dwukrotnie.
WordPress nie posiada wbudowanej opcji zapobiegającej duplikowaniu postów w wielu pętlach. Jednakże, dzięki naszemu ponad 15-letniemu doświadczeniu w obsłudze różnych witryn WordPress, nauczyliśmy się unikać tego problemu. Dlatego stworzyliśmy niestandardowy fragment kodu, który możesz dodać do swojej witryny, aby uniknąć wyświetlania zduplikowanych postów w różnych pętlach.
W tym artykule pokażemy Ci, jak łatwo uniknąć powielania wyświetlania postów za pomocą wielu pętli w WordPress.

Jak duplikaty postów pojawiają się w wielu pętlach WordPressa
Podczas tworzenia niestandardowego motywu WordPress lub niestandardowego szablonu strony, możesz czasami potrzebować użyć wielu pętli WordPress.
Na przykład możesz chcieć wyświetlić swoje najnowsze wpisy obok najczęściej popularnych wpisów na Twojej stronie. Wyświetlając wszystkie wpisy w każdej kategorii, możesz również pomóc czytelnikom znaleźć interesujące treści.
We wszystkich tych przykładach pojedynczy wpis może spełniać kryteria dla wielu pętli. Kiedy tak się dzieje, WordPress wyświetli zduplikowaną treść.
Ta zduplikowana treść może sprawić, że Twoja witryna będzie wyglądać niechlujnie i nieprofesjonalnie. Zajmuje również miejsce na ekranie, nie dodając wartości.
Ponieważ dynamicznie generujesz posty dla każdego pętli, nie możesz ręcznie przewidzieć, czy duplikat posta pojawi się w wielu pętlach.
Mając to na uwadze, przyjrzyjmy się łatwemu sposobowi unikania duplikatów postów podczas pracy z wieloma pętlami w WordPress.
Unikanie zduplikowanych postów w wielu pętlach WordPressa
W tym przewodniku pokażemy kilka przykładowych kodów WordPress, które powodują błąd zduplikowanych postów, a następnie udostępnimy fragment kodu, który rozwiązuje ten problem.
Podczas tworzenia motywu potomnego WordPress lub niestandardowego szablonu, Twój kod może być zupełnie inny. Możesz jednak użyć naszego fragmentu kodu jako punktu wyjścia, a następnie zmodyfikować go, aby pasował do Twojej własnej strony internetowej.
Najpierw utwórzmy problem z duplikatem posta. W poniższym przykładowym kodzie wyświetlamy wszystkie posty z kategorii „travel” i wszystkie posty z kategorii „news” bez unikania duplikatów postów:
/****** 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();
?>
Jak widać, ten kod nie sprawdza duplikatów postów w żadnym z zapytań.
Jeśli post należy zarówno do kategorii „wiadomości”, jak i „podróże”, pojawi się dwukrotnie, jak widać na poniższym obrazku.

Naprawmy ten problem.
Aby uniknąć duplikatów postów na Twoim blogu WordPress, musisz tymczasowo przechowywać dane o wszystkich postach wyświetlanych w pierwszej pętli.
Po uzyskaniu tych informacji możesz zmodyfikować drugie zapytanie, aby zapobiec pojawianiu się zduplikowanych postów w drugiej pętli:
/****** 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();
?>
W powyższym kodzie przechowujemy identyfikatory postów w tablicy o nazwie $exclude. Następnie dodajemy argument post__not_in do drugiego zapytania, co wykluczy posty, które zostały wyświetlone w pierwszym pętli.
Jeśli nie znasz się na dodawaniu fragmentów kodu do swojej witryny, łatwiejszym sposobem jest użycie WPCode. Jest to najlepsza wtyczka do fragmentów kodu dla WordPress, która pomaga dodawać niestandardowy kod bez ryzyka uszkodzenia witryny.
Najpierw musisz zainstalować i aktywować wtyczkę WPCode. Jeśli potrzebujesz pomocy, zapoznaj się z naszym przewodnikiem jak zainstalować wtyczkę WordPress.
Po aktywacji możesz przejść do Code Snippets + Add Snippet z panelu WordPress, a następnie kliknąć opcję „Add Your Custom Code (New Snippet)”.

Następnie możesz wkleić niestandardowy kod w obszarze Podgląd kodu i wpisać tytuł na górze.
Będziesz także musiał wybrać „Typ kodu” jako Fragment PHP, klikając menu rozwijane.

Po wprowadzeniu kodu po prostu przewiń w dół, aby wybrać sekcję Wstawianie.
Tutaj możesz użyć domyślnego ustawienia „Automatycznie wstaw” i pozwolić wtyczce automatycznie dodać kod do Twojej witryny.

Po zakończeniu po prostu zapisz fragment i aktywuj go.
Aby uzyskać więcej informacji, zapoznaj się z naszym przewodnikiem na temat jak dodać niestandardowy kod w WordPress.
Teraz, jeśli odwiedzisz swoją stronę WordPress, zobaczysz, że zduplikowane posty zniknęły.

Mamy nadzieję, że ten artykuł pomógł Ci dowiedzieć się, jak unikać wyświetlania zduplikowanych postów za pomocą wielu pętli w WordPress. Możesz również zapoznać się z naszym przewodnikiem na temat jak wyświetlić dowolną liczbę postów w pętli WordPress oraz jak tworzyć posty przypięte w WordPress.
Jeśli podobał Ci się ten artykuł, zasubskrybuj nasz kanał YouTube po samouczki wideo WordPress. Możesz nas również znaleźć na Twitterze i Facebooku.


Nick J
Czy istnieje wtyczka, która to robi?
Satriyo
Czy ktoś mógłby mi powiedzieć, jak to zrobić? Jestem tu naprawdę nowy i potrzebuję pomocy, proszę podaj mi jasny przykład z identyfikatorem posta, jak go przechowywać? Powiedzmy, że mój to 1527.
Gaurav
Uruchamiam 2 pętle przed pętlami określonej kategorii, w których chciałbym uniknąć duplikatów. Jak więc przechowywać identyfikatory w tablicy z pierwszych dwóch pętli?
Joe
Dokładnie tego szukałem – dziękuję!
Guilherme Alves
Dziękuję bardzo :))) Bardzo mi to pomaga!
Uratowałeś mi dzień <3
Wsparcie WPBeginner
Cześć 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
Ta metoda działa dobrze, dopóki oba z 2 pętli znajdują się w jednym pliku.
ale kiedy umieściłem pierwszą pętlę w header.php, a drugą w index.php,
in_array($post->ID, $do_nit_duplicate) zwraca null.
Co mogę zrobić?
warren
Dzień dobry wszystkim,
czy to zadziała w moim obecnym problemie z podwójnym wyświetlaniem postów na stronie? dosłownie wyświetla kopię pod postami i przycisk 1, 2, ->
strona jest Dezaktywowałem i ponownie aktywowałem wtyczki, zaraz mnie szlag trafi.
agus
czy możesz mi pomóc?
Mam problem z duplikującą się kategorią na mojej stronie
proszę
#dziękuję
Wsparcie WPBeginner
Wygląda na problem specyficzny dla motywu, skontaktuj się z twórcami motywu w celu uzyskania wsparcia.
Admin
Gabriel
Zanim przejdziemy do domyślnej pętli, czy nie powinniśmy użyć wp_reset_postdata(); ?
Greg
@sergeyvlasov – Dzięki, to zadziałało u mnie
chociaż zmieniłem
$do_nit_duplicate do $do_not_duplicate
Ron Hantman
Sprawdź to rozwiązanie, które wykonuje to zadanie poza pętlą:
http://wordpress.stackexchange.com/questions/61936/removing-duplicate-values-between-two-wordpress-queries/
sergeyvlasov
Myślę, że jest błąd w tym algorytmie. Potrafi wykryć co najwyżej 1 (jedną) duplikację. Więc magiczna linia wyglądałaby tak:
$do_not_duplicate[] = $post->ID
a następnie użyta w ten sposób:
if(in_array($post->ID, $do_nit_duplicate)) continue;