Mostrare gli articoli recenti con immagine di anteprima in WordPress senza plugin
I plugin sono belli, sono comodi, sono essenziali, ma certamente sono anche del codice in più da caricare e possono rallentare WordPress!
In questo articolo ti spiego come mostrare gli ultimi N articoli con la relativa immagine di anteprima, senza plugin! In più ho utilizzato anche la cache, così da minimizzare le interrogazioni al database 😮
Il risultato
Prima di iniziare, ecco il risultato che ho ottenuto utilizzando il codice che ti mostrerò a breve:
e questo è il relativo codice HTML mostrato nel sorgente della pagina:
Il codice
Fai un backup via FTP del file functions.php e style.css del tuo tema, prevenire è meglio che curare 🙂
Ora vai su Aspetto > Editor > functions.php ed incolla il seguente codice prima dell’ultimo tag ?> .
[php]
/******************
* Mostra gli articoli recenti con l’immagine di anteprima
* Author: Roberto Iacono
* Website: https://www.robertoiacono.it/
* $quanti_post_mostrare = 5; quanti articoli mostrare?
* $lunghezza_titolo = 0; quanti caratteri deve essere lungo il titolo? Lascia 0 per mostrarli tutti
* $title_more = ‘…’; testo da visualizzare dopo il troncamento
* $rimuovi_cat = null; non mostra gli ultimi articoli di una data categoria. Se vuoi escludere una o più categorie, usa array(-1,-2,-3) dove 1, 2, 3 sono gli ID delle gategorie da escludere
* $vuoi_la_cache = 1; imposta la cache per salvare i risultati in memoria, così da alleggerire le richieste al Database
* $mostra_titolo = 1; mostra il titolo Recent Posts predisposto per la localizzazione
*
* Se vuoi aggiungere/eliminare dei filtri sugli ultimi articoli, devi modificare la query che genera gli articoli da mostrare, ti rimando a http://codex.wordpress.org/Class_Reference/WP_Query
*******************/
function RIrecentPosts($quanti_post_mostrare, $lunghezza_titolo, $title_more, $rimuovi_cat, $vuoi_la_cache, $mostra_titolo) {
$ri_recent_post = get_transient(‘RIrecentPosts_transient_key’);
if ($ri_recent_post === false || $vuoi_la_cache == 0) {
$ri_recent_posts = new WP_Query();
$ri_recent_posts->query(array( ‘category__not_in’ => $rimuovi_cat, ‘showposts’ => $quanti_post_mostrare ));
$ri_recent_post = ”;
// Aggiunge il titolo Recent Posts
if($mostra_titolo == 1)
$ri_recent_post .= ‘<h2>’. __(‘Recent Posts’) .'</h2>’;
$ri_recent_post .= ‘<ul>’;
while ($ri_recent_posts->have_posts()) : $ri_recent_posts->the_post();
$ri_recent_post .= ‘<li>’;
// mostra l’immagine di anteprima
$ri_recent_post .= ‘<a href="’. get_permalink() .’">’. get_the_post_thumbnail(get_the_ID(),’ri-recent-thumbnails’) .'</a>’;
// mostra il titolo
$ri_recent_post .= ‘<a href="’. get_permalink() .’" title="’. get_the_title() .’">’;
// taglia il titolo se è più lungo di $lunghezza_titolo caratteri
if ($lunghezza_titolo > 0 ){
if(strlen(get_the_title()) > $lunghezza_titolo)
$ri_recent_post .= substr(get_the_title(), 0, $lunghezza_titolo) . $title_more;
}
else
$ri_recent_post .= get_the_title();
$ri_recent_post .= ‘</a>’;
$ri_recent_post .= ‘</li>’;
endwhile;
$ri_recent_post .= ‘</ul>’;
wp_reset_query();
// salva i risultati in cache per 1 giorno
if ($vuoi_la_cache == 1)
set_transient(‘RIrecentPosts_transient_key’, $ri_recent_post, 3600 * 24);
}
echo $ri_recent_post;
}
// elimina la cache per mostrare gli ultimi articoli recenti senza plugin
add_action( ‘publish_post’, ‘delete_RIrecentPosts_transient_key’,10,2 );
function delete_RIrecentPosts_transient_key()
{
delete_transient(‘RIrecentPosts_transient_key’);
}
add_image_size( ‘ri-recent-thumbnails’, 100, 100, true );
[/php]
Poi vai su Aspetto > Editor > styles.css ed incolla il seguente codice dove vuoi (magari in fondo):
[css]
.ri_recent_posts {
list-style:none;
}
.ri_recent_posts li {
display:block;
}
.ri_recent_posts li:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
overflow: hidden;
float: none;
}
.ri_recent_posts img {
float:left;
margin: 5px
}
[/css]
Utilizza il codice qui sotto per richiamare la funzione che viene utilizzata per mostrare gli ultimi N articoli recenti:
[php]
<?php RIrecentPosts(5,0,’…’,null,1,1); ?>
[/php]
Per visualizzare gli articoli recenti nella sidebar, dovrai inserire questo codice nella sidebar attraverso un Widget. Per far ciò, ti consiglio di utilizzare lo snippet per abilitare il widget di Testo ad eseguire il php, che di default non permette l’esecuzione del codice php.
La chiamata della funzione
La chiamata della funzione RIrecentPosts richiede 6 parametri nel seguente ordine:
- Inserisci il numero di articoli che vuoi mostrare.
- Inserisci il numero di caratteri del titolo dell’articolo da mostrare. Con 0 li mostra tutti.
- Nel caso al punto precedente avessi impostato un valore diverso da 0, allora puoi scegliere che cosa mostrare dopo il troncamento del titolo.
- Escludi gli articoli di determinate categorie. Per escludere certe categorie scrivi array(-1,-2,-3), dove 1, 2, 3 sono gli ID delle categorie da escludere. Puoi escludere anche solo una categoria, utilizzando array(-1) . Con null verranno mostrati gli articoli di tutte le categorie.
- Vuoi salvare il risultato in cache? Allora lascia 1, altrimenti imposta 0. Quando verrà pubblicato un nuovo articolo, la cache verrà svuotata automaticamente.
- Se uguale ad 1, viene mostrato il titolo Recent Posts predisposto per la localizzazione. Imposta 0 se non lo vuoi visualizzare.
Dimensioni dell’immagine di anteprima
Con questo codice, alla riga 56, crei un tipo di thumbnail (immagine di anteprima) che ho chiamato ri-recent-thumbnails, delle dimensioni 100×100 px. Puoi modificare le dimensioni cambiando i relativi lavori alla riga 56.
Il tipo di thumbnail creato è diverso da quello nativo di WordPress, che invece puoi gestire da Impostazioni > Media >.
Puoi anche utilizzare le dimensioni delle thumbnail nativa di WordPress, in questo caso sostituisci ri-recent-thumbnails con thumbnail, ed elimina la riga 56.
Le immagini di anteprima, se hai già caricato immagini in precedenza, non saranno quasi mai delle dimensioni desiderate. In questo caso, utilizza il plugin Regenerate Thumbnails per rigenerare tutte le thumbnails! Ti consiglio di fare un backup della cartella wp-content/uploads/ prima di procedere con la rigenerazione.
La cache
Ho aggiunto (oggi mi sentivo un abile programmatore ;)) un sistema di cache persistente, che ha una durata temporale limitata. Di default, l’ho impostata ad un giorno (vedi la riga 44).
La cache si svuota ogni volta che viene pubblicato un nuovo articolo, ma è anche possibile disattivarla passando il valore 0 come quinto parametro alla funzione RIrecentPosts.
Attendo un tuo feedback
Non mi ritengo un abile programmatore, per cui tutto il codice può essere ottimizzato… proprio per questo motivo aspetto dei tuoi suggerimenti ed un tuo parere nei commenti qui sotto 🙂
01/03/2013 alle 20:31
Io visualizzo i titoli ma non le immagini…hai idea di cosa potrebbe essere?
Ciao e grazie, filippo.
02/03/2013 alle 08:09
Ciao Filippo,
probabilmente non hai impostato le immagini in evidenza per gli articoli. Fai una prova con uno solo.
02/03/2013 alle 16:26
No, ok, avevo fatto una cazzata io. Sorry, ora le immagini vanno.
Però ho un’altro problema…
Quando intervengo sul codice sia nel template che in function.php non vedo le modifiche – tipo dimensioni della miniatura o il numero di articoli da visualizzare – anche se vuoto la cache del browser.
Ciao e grazie. Ancora.
04/03/2013 alle 15:36
Hai messo a 0 la cache che ho aggiunto al codice? Leggi bene l’articolo.
17/05/2013 alle 19:39
Ciao, complimenti per l’articolo, mi stai molto facilitando il lavoro con un portale.
Da programmatore php ti dico che è un ottimo codice, ovviamente ognuno lo può personalizzare per se ma è veramente molto buono! 😉 continua così!
23/05/2013 alle 14:51
Ti ringrazio 🙂
20/04/2013 alle 20:32
ciao, scusa…ho lo stesso problema…vedo i titoli ma non
le immagini..di sicuro è una banalità che mi sfugge…mi dareste una mano grazie mille!
26/04/2013 alle 20:13
Hai impostato l’immagine in evidenza per ogni articolo?
11/03/2013 alle 18:42
Ciao!
Intanto grazie per l’articolo, ho cercato qualcosa di simile per tutto il giorno e alla fine credo che questa sia proprio la soluzione che stavo cercando!
Due cose:
1. Le thumbnails appaiono sopra il titolo della pagina. Probabilmente ho sbagliato nel mettere la chiamata della funzione… C’è un posto preciso dove va inserita?
2. E’ possibile fare in modo che le immagini non siano in lista ma una di fianco all’altra?
Grazie ancora,
Lara
11/03/2013 alle 18:51
Ciao Lara, per fare quallo che dici devi “solamente” modificare il codice css, tipo con un float:left;
23/03/2013 alle 13:57
Ciao Roberto, senti io nel file function.php non ho il tag che citi tu in alto, il tema è stato cambiato non è di default. Se incollo quel codice infatti mi da errore poi la pagina
23/03/2013 alle 14:06
Ok risolto, ma se volessi avere questo risultato ma con notizie di un altro blog ? E’ fattibile? perchè non trovo soluzione..
25/03/2013 alle 13:53
Sì ma il procedimento è molto più complesso.
17/04/2013 alle 16:52
Ciao Roberto e grazie per questo tuo lavoro.
Ho solo un piccolo problema e non so di preciso dove metter mano nel CSS.
Io vorrei allineare il titolo dell’articolo alla miniatura centralmente, ma copiano così com’è il codice da te sviluppato questo è il risultato che ottengo
http://oi46.tinypic.com/28m35fs.jpg
Come posso risolvere il problema? Cosa devo aggiungere o togliere al CSS?
20/04/2013 alle 18:05
Dipende anche dalla struttura dell’html oltre che del codice CSS… mi dispiace ma non vedo l’immagine
23/04/2013 alle 12:37
Se volessi inserire anche una piccola anteprima dell’articolo? grazie
26/04/2013 alle 19:02
Devi prendere il contenuto di the_content e tagliarlo dopo N caratteri (come avvene già per il titolo)
04/05/2013 alle 13:22
Ciao Roberto… ho inserito il tuo codice nel mio sito correttamente! Ma il mio problema è che prende il css della mia sidebar… in particolare le mie immagini non sono integrate con il testo (cioè restano sopra ed il testo va sotto) Ora l’ho rimosso, ma se vuoi dare un’occhiata lo ripristino! PS non so se è solo un problema mio, ma quando inserisco un commento l’autocompletamento dei campi non funziona bene (provo a selezionare il campo e sparisce)
09/05/2013 alle 13:47
Allora devi modificare il codice css (prova ad usare “!important” )
18/05/2013 alle 00:07
Ricordati nella query di aggiungere ‘caller_get_posts’=>1 in modo da non visualizzare gli articoli in evidenzia esclusi da categoria. Ci ho sbattuto al testa 2 ore prima di capire il perchè mi visualizzava un articolo di una categoria non compresa! 😉
ricordati di aggiungere anche nella formattazione output il nome del div a cui si riferisce il css.
21/05/2013 alle 23:28
Ciao Roberto,
molto utile questo articolo, e se invece di mostrare gli ultimi articoli, volessi mostrare solo gli ultimi articoli di una determinata categoria?
Con questo script se non sbaglio invece di null dovrei inserire gli id di tutte le categorie da escludere, siccome sono molte, si potrebbe ragionare all’incontrario? Cioè mostrare solo le categorie che voglio. 🙂
grazie
23/05/2013 alle 14:24
Certamente, tira via il meno da array(-1,-2,-3) —> array(1,2,3)
23/05/2013 alle 17:35
Grazie, perfetto. 🙂
Ho provato a modificare anche le dimensioni delle miniature (riga 56) perché le vorrei piú grandi ma nulla, rimangono uguali.
Cosa potrebbe essere?
31/05/2013 alle 15:05
La cache? Prova a creare un’altra tipologia di thumbnail…
26/05/2013 alle 15:42
Ciao, proprio quello che stavo cercando per abbellire il blog creato per mia moglie.
Minimo un abbraccio lo riceverò, spero… ma c’è la piccola.
Grazie, sei in gamba.
TI seguirò.
31/05/2013 alle 14:30
Grazie a te Antonio 🙂
Incrocio le dita per l’abbraccio 😉
30/05/2013 alle 09:48
Ciao mi chiamo Andrea .
Molto interessante il tuo post , mi serve un aiuto/consiglio su WordPress.
Ho un sito di annunci gratuiti http://www.mercatinoplus.net …..vorrei inserire un slider.
Ho girato molto sul web senza trovare secondo ME quello che fa al mio caso.
Che tipo di slider , uno (slideshow galleria carousel ) che vada in automatico a prendere le immagini e i link degli annunci inseriti .
Secondo il tuo parere il tuo codice può fare per il mio caso
Mi poi aiutare per favore
Grazie
31/05/2013 alle 13:49
Ciao Andrea,
dpvresti adattarlo… Prova a leggere https://www.robertoiacono.it/plugin-inserire-slider-wordpress/
15/06/2013 alle 08:52
ho lo stesso problema dell’utente Filippo che in data 01/03/2013 ti faceva questa domanda:
Io visualizzo i titoli ma non le immagini…hai idea di cosa potrebbe essere?
Tu rispondevi:
probabilmente non hai impostato le immagini in evidenza per gli articoli. Fai una prova con uno solo.
che cosa significa “impostare le immagini in evidenza per gli articoli”?
puoi spiegarmi meglio…
Grazie e cordiali saluti
Matteo
24/06/2013 alle 10:39
Ciao Matteo,
sulla colonna a destra durante la modifica/scrittura articolo dovrebbe comparire un campo “Imposta immagine in evidenza”. Se non c’è, clicca in alto a destra su “Impostazioni schermo” e clicca sulla casella “immagine in evidenza”.
Ora seleziona l’immagine…
Ciao
24/06/2013 alle 11:56
Ciao Roberto,
Grazie mille per la risposta, sono riuscito a fare quello che mi hai detto, le immagini compaiono, ma ora ho questo piccolo problema:
affianco alle thumbnails il titolo non mi compare di lato come nel tuo esempio, ma compare di lato in basso e poi il testo prosegue sotto la miniatura… per farti capire meglio ho postato l’immagine su pinterest potresti dargli una occhiata?
http://pinterest.com/pin/337910778261767368/
che cosa posso fare?
Grazie e Cordiali saluti
Matteo Pirola
28/06/2013 alle 15:12
Devi modificare il css, probabilmente impostando display:block; per il testo… ma sarebbe da testare
29/06/2013 alle 11:02
Ciao Roberto
ma tra i seguenti css:
.ri_recent_posts {
list-style:none;
}
.ri_recent_posts li {
display:block;
}
.ri_recent_posts li:after {
content: “.”;
display: block;
height: 0;
clear: both;
visibility: hidden;
overflow: hidden;
float: none;
}
.ri_recent_posts img {
float:left;
margin: 5px
}
quale si riferisce al testo? penso il primo… non ho capito dove dovrei provare a inserire il display:block?
Cordiali Saluti
03/07/2013 alle 17:25
Hai ragione,
.ri_recent_posts li si riferisce al testo, ma anche all’immagine. Puoi o inserire un div (per il testo), oppure prova ad impostare display: table-cell; al posto di display:block; sempre in .ri_recent_posts li