Se si utilizzano più query di WordPress per visualizzare diverse serie di pubblicazioni, è possibile che si verifichino contenuti duplicati. Questo perché alcune pubblicazioni potrebbero corrispondere a più di un loop e apparire due volte.
WordPress non dispone di un’opzione integrata per evitare la duplicazione di pubblicazioni in loop multipli. Tuttavia, negli oltre 15 anni di esperienza nella gestione di diversi siti WordPress, abbiamo imparato come evitare questo problema. Abbiamo quindi creato uno snippet di codice personalizzato che potete aggiungere al vostro sito per evitare che i post duplicati vengano mostrati in loop diversi.
In questo articolo vi mostreremo come evitare facilmente la visualizzazione di articoli duplicati con loop multipli in WordPress.
Come appaiono gli articoli duplicati in più loop di WordPress
Quando si crea un tema WordPress personalizzato o un template di pagina personalizzato, a volte è necessario utilizzare più loop di WordPress.
Ad esempio, potreste voler mostrare i post recenti accanto a quelli più popolari del vostro sito. Mostrando tutti i post di ogni categoria, si possono anche aiutare i lettori a trovare contenuti interessanti.
In tutti questi esempi, un singolo articolo può corrispondere ai criteri di più loop. In questo caso, WordPress visualizza i contenuti duplicati.
Questi contenuti duplicati possono far sembrare il sito disordinato e poco professionale. Inoltre, occupano spazio sullo schermo senza aggiungere valore.
Poiché si generano dinamicamente articoli per ogni loop, non è possibile prevedere manualmente se un articolo duplicato apparirà in più loop.
Detto questo, vediamo un modo semplice per evitare articoli duplicati quando si ha a che fare con loop multipli in WordPress.
Evitare articoli duplicati in più loop di WordPress
In questa guida vi mostreremo alcuni esempi di codice WordPress che causano l’errore di duplicazione degli articoli e condivideremo uno snippet di codice che corregge il problema.
Quando si crea un tema child di WordPress o un template personalizzato, il codice può essere completamente diverso. Tuttavia, è possibile utilizzare il nostro frammento di codice come punto di partenza e modificarlo per adattarlo al proprio sito web.
Per prima cosa, creiamo un problema di articoli duplicati. Nel codice di esempio che segue, si visualizzano tutti gli articoli della categoria “viaggi” e tutti gli articoli della categoria “notizie”, senza evitare i duplicati:
/****** 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();
?>
Come si può notare, questo codice non controlla la presenza di articoli duplicati in nessuna delle due query.
Se un articolo appartiene sia alla categoria “notizie” che a quella “viaggi”, apparirà due volte, come si può vedere nell’immagine seguente.
Correggiamo questo problema.
Per evitare di duplicare gli articoli sul vostro blog WordPress, dovrete memorizzare temporaneamente i dati di chi è stato visualizzato nel primo loop.
Una volta ottenute queste informazioni, è possibile modificare la seconda query per impedire che nel secondo loop appaiano articoli duplicati:
/****** 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();
?>
Nel codice precedente, memorizziamo gli ID degli articoli in un array chiamato $exclude
. Successivamente, aggiungiamo l’argomento post__not_in
alla seconda query, che escluderà i post visualizzati nel primo loop.
Se non avete familiarità con l’aggiunta di snippet di codice al vostro sito, un modo più semplice è usare WPCode. È il miglior plugin di snippet di codice per WordPress che vi aiuta ad aggiungere codice personalizzato senza rischiare di rompere il vostro sito.
Per prima cosa, è necessario installare e attivare il plugin WPCode. Se avete bisogno di aiuto, consultate la nostra guida su come installare un plugin di WordPress.
Dopo l’attivazione, è possibile andare su Code Snippets + Add Snippet dalla dashboard di WordPress e fare clic sull’opzione “Add Your Custom Code (New Snippet)”.
Successivamente, è possibile incollare il codice personalizzato nell’area Anteprima codice e inserire un titolo in alto.
È inoltre necessario selezionare il ‘Tipo di codice’ come Snippet PHP facendo clic sul menu a discesa.
Dopo aver inserito il codice, è sufficiente scorrere verso il basso per selezionare la sezione Pannello di inserimento.
È possibile utilizzare l’impostazione predefinita di “Auto Insert” e lasciare che il plugin aggiunga automaticamente il codice al sito.
Una volta terminato, è sufficiente salvare lo snippet e attivarlo.
Per maggiori dettagli, consultare la nostra guida su come add-on di codice personalizzato in WordPress.
Ora, se visitate il vostro sito web WordPress, vedrete che i post duplicati sono scomparsi.
Speriamo che questo articolo vi abbia aiutato a capire come evitare la visualizzazione di post duplicati con loop multipli in WordPress. Potreste anche voler consultare la nostra guida su come disabilitare un numero qualsiasi di pubblici nel loop di WordPress e su come rendere i post in evidenza in WordPress.
Se questo articolo vi è piaciuto, iscrivetevi al nostro canale YouTube per le esercitazioni video su WordPress. Potete trovarci anche su Twitter e 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.
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
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.
Admin
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;