Jeśli używasz wielu zapytań WordPress do wyświetlania różnych wpisów, możesz natknąć się na zduplikowane treści. Dzieje się tak, ponieważ niektóre wpisy mogą pasować do więcej niż jednej pętli i pojawiać się dwukrotnie.
WordPress nie ma wbudowanej opcji unikania duplikatów wpisów w wielu pętlach. Jednak dzięki naszemu ponad 15-letniemu doświadczeniu w obsłudze różnych witryn WordPress nauczyliśmy się, jak uniknąć tego problemu. Stworzyliśmy więc własny fragment kodu, który możesz dodać do swojej witryny i uniknąć wyświetlania zduplikowanych wpisów w różnych pętlach.
W tym artykule pokażemy, jak łatwo uniknąć wyświetlania zduplikowanych wpisów z wieloma pętlami w WordPress.
Jak zduplikowane wpisy pojawiają się w wielu pętlach WordPressa?
Podczas tworzenia niestandardowego motywu WordPress lub własnego szablonu strony, czasami może być konieczne użycie wielu pętli WordPress.
Na przykład, możesz chcieć pokazać twoje ostatnie wpisy obok najpopularniejszych wpisów w witrynie. Pokazują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 wielu pętli. Gdy tak się stanie, WordPress wyświetli zduplikowaną treść.
Duplikaty treści mogą sprawić, że twoja witryna będzie wyglądać niechlujnie i nieprofesjonalnie. Zajmuje również miejsce na ekranie bez dodawania wartości.
Ponieważ dynamicznie generujesz wpisy dla każdej pętli, nie możesz ręcznie przewidzieć, czy zduplikowany wpis pojawi się w wielu pętlach.
Mając to na uwadze, przyjrzyjmy się łatwemu sposobowi na uniknięcie zduplikowanych wpisów, gdy mamy do czynienia z wieloma pętlami w WordPressie.
Unikanie zduplikowanych wpisów w wielu pętlach WordPressa
W tym przewodniku pokażemy przykładowy kod WordPressa, który powoduje błąd zduplikowanego wpisu, a następnie udostępnimy fragment kodu, który poprawi ten problem.
Podczas tworzenia motywu potomnego WordPress lub własnego 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 tak, aby pasował do twojej witryny internetowej.
Najpierw stwórzmy problem zduplikowanych wpisów. W poniższym przykładowym kodzie wyświetlamy wszystkie wpisy w kategorii „podróże” i wszystkie wpisy w kategorii „wiadomości” bez unikania duplikatów wpisó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 zduplikowanych wpisów w żadnym z zapytań.
Jeśli wpis należy zarówno do kategorii „wiadomości”, jak i „podróże”, pojawi się dwukrotnie, jak widać na poniższym obrazku.
Poprawmy ten problem.
Aby uniknąć duplikatów wpisów na twoim blogu WordPress, musisz tymczasowo przechowywać dane o wszystkich wpisach wyświetlanych w pierwszej pętli.
Po uzyskaniu tych informacji można zmodyfikować drugie zapytanie, aby zapobiec pojawianiu się zduplikowanych wpisó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 wpisów w tablicy o nazwie $exclude
. Następnie dodajemy argument post__not_in
do drugiego zapytania, co spowoduje wykluczenie wpisów, które zostały wyświetlone w pierwszej pętli.
Jeśli nie jesteś zaznajomiony z dodawaniem fragmentów kodu do twojej witryny, łatwiejszym sposobem jest użycie WPCode. Jest to najlepsza wtyczka do fragmentów kodu dla WordPressa, która pomaga dodawać własny kod bez ryzyka zepsucia twojej witryny.
Najpierw należy zainstalować i włączyć wtyczkę WPCode. Jeśli potrzebujesz pomocy, zapoznaj się z naszym przewodnikiem na temat instalacji wtyczki WordPress.
Po włączaniu, możesz przejść do Code Snippets + Add Snippet z kokpitu WordPress, a następnie kliknąć opcję „Add Your Custom Code (New Snippet)”.
Następnie można wkleić własny kod w obszarze Podgląd kodu i wpisz tytuł u góry.
Musisz również wybrać „Rodzaj kodu” jako PHP Snippet, klikając menu rozwijane.
Po wpiszeniu kodu wystarczy przewinąć w dół, aby wybrać sekcję Wybierak.
Tutaj możesz użyć domyślnego ustawienia „Auto wstawić” i pozwolić wtyczce automatycznie dodać kod do twojej witryny.
Gdy skończysz, po prostu zapisz fragment kodu i włącz go.
Więcej szczegółów można znaleźć w naszym przewodniku na temat dodawania własnego kodu w WordPress.
Teraz, jeśli przejdziesz na swoją witrynę internetową WordPress, zobaczysz, że zduplikowane wpisy zniknęły.
Mamy nadzieję, że ten artykuł pomógł ci dowiedzieć się, jak uniknąć wyświetlania zduplikowanych wpisów z wieloma pętlami w WordPress. Możesz również zapoznać się z naszym przewodnikiem na temat tego, jak wyłączyć dowolną liczbę wpisów w pętli WordPress i jak tworzyć przypięte wpisy w WordPress.
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.
Nick J
Is there a plugin that does this?
Satriyo
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
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
Just what I was looking for – thank you!
Guilherme Alves
Thank you soo much :))) This helps me alot!
Save my day <3
WPBeginner Support
Hi Guilherme,
You are welcome Don’t forget to follow us on Facebook for more WordPress tips and tutorials.
Administrator
Julie
AWESOME!! Thank you so much! And thank you SERGEYVLASOV for that last comment– Worked like a charm for my multiple loops. Hooray!!
Pirooz
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
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
can you help me?
I have proble with duplicate category in my site
please
#thanks
WPBeginner Support
Seems like a theme specific issue, contact theme developers for support.
Administrator
Gabriel
Before iterating over the default loop shouldn’t we use wp_reset_postdata(); ?
Greg
@sergeyvlasov – Thanks that worked for me
tho i changed
$do_nit_duplicate to $do_not_duplicate
Ron Hantman
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
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;