I post correlati sono un elenco di articoli che trattano lo stesso argomento del post che stiamo leggendo.
In questo post mostreremo un esempio di come visualizzare i post correlati per tag.
Questo il codice completo:
<?php global $post; $posttags = wp_get_post_tags($post->ID); if ($posttags) { $tags = array(); $blacklist = array('blacklist'); foreach ($posttags as $t) { if(!in_array(strtolower($t->name),$blacklist)) { $tags[] = str_replace(' ','-',$t->name); } } $ts = implode(",", $tags); $args = array( 'numberposts' => 3, 'tag'=> $ts, 'exclude' => $post->ID, 'orderby' => 'post_date', 'order' => 'desc' ); $related = get_posts($args); ?> <?php if ($related) { ?> <?php // Salviamo $post in una variabile temporanea ?> <?php $post_TEMP = $post; ?> <ul> <li>Articoli correlati<li> <?php foreach ($related as $post) { ?> <?php setup_postdata($post); ?> <li><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li> <?php } ?> </ul> <?php // Resettiamo la variabile $post $post = $post_TEMP; setup_postdata($post); } } ?>
Analizziamo il codice:
global $post; $posttags = wp_get_post_tags($post->ID);
Prima di tutto rendiamo globale la variabile $post per rendere disponibili i dati del post, mentre con la funzione wp_get_post_tags() recuperiamo i tag associati al post.
$tags = array(); $blacklist = array('blacklist'); foreach ($posttags as $t) { if(!in_array(strtolower($t->name),$blacklist)){ $tags[] = str_replace(' ','-',$t->name); } }
Verificato che ci sono tag associati al post, possiamo impostare un controllo per escludere dei tag specifici dal filtro per correlare i post. Per impostare i tag da escludere, aggiungere i termini desiderati nell’array $blacklist. Inoltre, nel ciclo dove si filtrano i tag da eslcudere, con la funzione str_replace() convertiamo i gli spazi bianchi dei tag contenenti più parole, in modo da avere lo slug del tag.
$ts = implode(",", $tags);
Creiamo una variabile $ts formattando i tag per la query,
$args = array( 'numberposts' => 3, 'tag'=> $ts, 'exclude' => $post->ID, 'orderby' => 'post_date', 'order' => 'desc' ); $related = get_posts($args);
Creiamo una array per impostare i parametri della query e con la funzione get_posts() i post correlati. In questo esempio i post visualizzati sono 3, ma basta cambiare il valore di numberposts per visualizzare più o meno post correlati.
// Salviamo $post in una variabile temporanea $post_TEMP = $post;
Verificato che ci siano post correlati, salviamo la variabile $post in una variabile temporanea, in modo da usare le funzioni native di Wordpress per visualizzare le informazioni dei post correlati.
<ul> <li><h3 class="georgia italic fsize-24">Articoli correlati</h3><li> <?php foreach ($related as $post) { ?> <?php setup_postdata($post); ?> <li class="post-related georgia italic"><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a> </li> <?php } ?> </ul>
Questo è il codice che stampa a video l’elenco dei post correlati. In questo esempio, visualizziamo solo il titolo dei post correlati, ma basta richiamare le funzioni di Wordpress per visualizzare le informazioni dei singoli post (es. the_author()).
// Reset $post $post = $post_TEMP; setup_postdata($post);
Infine resettiamo la variabile $post e il gioco è fatto.
Note: Puoi vedere il codice funzionante, alla fine di questo post.







Ciao,
questo articolo mi ha interessato moltissimo, ben realizzato e spiegato, i miei complimenti.
Ci sono arrivato perchè cercavo qualcosa per una esigenza simile, ma per le categorie.
Desideravo infatti ottenere un elenco di post correlati ad una categoria, ordinando i post per i loro tag.
Per esempio:
Categoria: Musica Classica
Tags: Beethoven, Mozart, Chopin.
Creo dei post che parlano di brani musicali con Categoria Musica Classica e li classifico utilizzando i Tags dei musicisti.
Se un utente desidera visualizzare tutti i post per Musica Classica vorrei offrire un elenco ordinato per Musicista e quindi per post.
Spero di essere stato chiaro, grazie per l’attenzione.
Un saluto.
Renato
Renato, per recuperare post correlati per categoria, puoi usare il filtro category nella funzione get_posts().
Ordinare i post per tag, al momento non è previsto per la funzione get_posts(), ma potresti far singole query per singolo tag.
un bell’articolo! soprattutto utile.
ti chiedo solo una cosa, testando il code:
$tags = array();
$blacklist = array(‘blacklist’);
foreach ($posttags as $t) {
if(!in_array(strtolower($t->name),$blacklist)){
$tags[] = str_replace(‘ ‘,’-',$t->name);
}
}
in questo passaggio, sostituendo i tag nell’array:
array(‘tag1′,’tag2′);
il comportamento è tutt’altro che buono, esclude articoli con una logica che non riesco a comprendere, ma di certo non esclude gli articoli con i tag segnati nell’array. pensavo dipendesse dal fatto che teneva in memoria questa variabile $blacklist quindi ho provato anche a resettarla ma niente.
non sono un programmatore di buon profilo, sono più che altro designer ed esperto html/css…il lato dinamico ce l’ho in studio…cmq non sai dirmi se c’è qualche errore che a me sfugge? ciao e grazie
ed ancora complimenti per questo blog
Ian
@Ian, in che array hai messo i tag?
hai un sito web di riferimento ?
[...] un occhiata a due post interessanti pubblicati sul gurucoder.org (post correlati per categoria) e kifulab.net (post correlati per tag) che spiegamo come crearsi da soli un widget per creare questo tipo di [...]