WordPress: eliminare i post duplicati nei loop multipli

L’utilissima funzione query_posts() o l’oggetto WP_Query (che poi sono fondamentalmente la stessa cosa) di WordPress permette di ottenere una lista di post impostando numerosi parametri di ricerca (vedi Very short snippet: visualizzare una lista di post per categoria o tag). Proprio a causa della sua versatilità nella ricerca dei post può capitare che usando la funzione due o più volte di seguito si ottengano dei “duplicati”. Questo può accadere, ad esempio, quando si cerca (filtra) per TAG; un post, infatti, può (anzi ha, nella maggioranza dei casi) avere associati più tag. Ne deriva che la lista dei post con TAG A può presentare un post presente anche nella lista dei post con TAG B.

Per eliminare il problema si può procedere in due modi diversi, in base alla versione di WordPress. Il primo consiste nel mettere da parte tutti gli ID del primo loop così da escluderli nel secondo. Questa tecnica può essere utilizzata per qualsiasi numero di loop e al il vantaggio di essere compatibile anche con le vecchie versioni di WordPress:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Primo loop
// L'array $ids[] usato sotto serve a tenere traccia degli
// id dei post che sono uscito con il primo loop
$ids = array();
query_posts('category_name=Flash&showposts=10');
while (have_posts()) : the_post();
    $ids[] = $post->ID;
    // ... output
endwhile;

// Secondo loop
// In questo caso l'output avviene solo nel cosa che
// $post->ID non sia presente nell'array $ids[]
query_posts('category_name=Adobe&showposts=10');
while (have_posts()) : the_post();
    if (!in_array($post->ID, $ids)) {
        // ... output
   }
endwhile;

Se la release di WordPress che stiamo usando è la 2.6 o superiore, possiamo applicare una comodoa variante al secondo loop:

1
2
3
4
5
6
7
8
9
10
11
12
// Secondo loop
// Wordpress 2.6+
// In questo caso è direttamente la query_posts() ad
// escludere gli ID dei post già visualizzati
query_posts(
    array('showposts' => 10,
          'cat' => 4,
          'post__not_in' => $ids,
          ));
while (have_posts()) : the_post();
    // ... output
endwhile;

L’opzione post__not_in insieme ad altre è ben documentata qui.

4 commenti a: “ ”

  1. 02 lug, 2009 Undolog.com» Wordpress: eliminare i post duplicati nei loop multipli:

    [...] articolo originale: Undolog.com» WordPress: eliminare i post duplicati nei loop multipli Articoli correlati: Undolog.com» Very short snippet: WordPress, prossimamente sul [...]

  2. 04 lug, 2009 Wordpress: eliminare i post duplicati nei loop multipli:

    [...] fonte: WordPress: eliminare i post duplicati nei loop multipli Articoli correlati: Undolog.com» WordPress: eliminare i post duplicati nei loop [...]

  3. 04 lug, 2009 Il meglio della settimana #24 | BigThink:

    [...] WordPress: eliminare i post duplicati nei loop multipli Un piccolo trucchetto per evitare di ripetere i post, quando abbiamo due loop nella stessa pagina. [...]

  4. 05 apr, 2010 Nikopolidis:

    Articolo molto interessante, io avrei una domanda che potrebbe implementare l’esecuzione dello script:
    utilizzando tale codice, se io clicco sulla seconda pagina, automaticamente mi ritornano gli stessi post della prima. Come posso fare per evitare ciò? :)

    Grazie

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre> // blocco generico
                   <code></code> // blocco generico
                   [cc_actionscript][/cc_actionscript] // Actionscript
                   [cc_actionscript3][/cc_actionscript3] // Actionscript 3
                   [cc_css][/cc_css] // CSS Style Sheet
                   [cc_html][/cc_html] // HTML
                   [cc_js][/cc_js] // Javascript
                   [cc_objc][/cc_objc] // Objective-C
                   [cc_php][/cc_objc] // PHP
                   [cc_sql][/cc_sql] // SQL