Andrea Beggi

Don't get it wrong just when you could've got it right.

Modificare il periodo di refresh dei feed esterni in WordPress

A T T E N Z I O N E ! Questo post ha piu' di sei mesi. Le informazioni contenute potrebbero non essere aggiornate.

Sul nuovo template ho messo in homepage alcuni “box”; un paio di questi recuperano le informazioni da un feed esterno e le ripubblicano. Per questo scopo WordPress ha una funzione apposita: fetch_feed, che restituisce un oggetto SimplePie utilizzabile per i propri scopi.

I risultati vengono cachati e ricaricati alla scadenza, ma purtroppo non c’è modo di impostare dalla funzione il tempo di refresh del feed, che di default è di 12 ore; specie per Twitter tale valore è un po’ troppo basso per i miei gusti, e ho cercato di capire se fosse modificabile. Il problema è banale, ma su Google i risultati sono viziati: la stragrande maggioranza riguarda i feed generati da WordPress, non quelli letti dall’esterno.

Alla fine ho capito che è necessario modificare una funzione, e questo introduce un secondo problema: il file da editare fa parte del core di WordPress, che non è mai consigliabile modificare. Inoltre il lavoro andrebbe perso al prossimo aggiornamento. La soluzione è fare la modifica nel file functions.php del tema, aggiungendo un filtro fatto così:

add_filter( 'wp_feed_cache_transient_lifetime', create_function('$a', 'return 3600;') );

Questa riga altera il comportamento predefinito della funzione in modo che i feed vengano ricaricati ogni ora (3600 secondi) dato che modifica il valore di wp_feed_cache_transient_lifetime.

E tutto funziona come per magilla.

 

Tags: ,

5 Commenti

flod | #

Primo risultato della ricerca su Google di “frequenza aggiornamento feed wordpress” :P

Battute a parte, a volte ho visto un comportamento un po’ strano di quel “lifetime” (il feed non si aggiornava comunque dopo il tempo previsto).

Altra info utile (cancellare a mano la cache dei feed)
http://wpengineer.com/2114/delete-all-feed-cache-via-sql-in-wordpress/

Non ne ho alcuna certezza (mai avuto il tempo di indagare) ma ho la sensazione che anche Wp-Super-Cache vada a cancellare questa cache.

Andrea | #

Secondo me dipende dal fatto che dipende tutto da wp_cron? Se nessuno visita il blog, come fa a partire il trigger? (Mi chiedo, eh?)

flod | #

Il sito in questione non ha molte visite ma 400/500 contatti al giorno li fa/faceva, per cui non credo fosse quello il problema.

Il feed era impostato per aggiornarsi ogni 30 minuti, a volte toccava andare a mano a cancellare il db usando le indicazioni del link (tipo quando il cliente chiedeva “perché il video non è ancora sul sito? eh? eh?”).

Alla fine non ho mai indagato a fondo, e da quando sono tornato a Wp-Super-Cache dopo un breve periodo con Quick Cache il problema non l’ho più riscontrato (per cui potrebbe anche essere questo il colpevole).

whiletrue | #

A questo spunto interessante aggiungiamo che si potrebbe inserire la funzione “remove_filter”, con gli stessi parametri, per ripristinare il tempo di cache predefinito (12 ore) dopo la chiamata “fetch_feed” al feed che vogliamo monitorare con frequenza maggiore. Già che ci siamo, suggeriamo di non impostare tempi minori dei 30 minuti citati da Andrea per i feed di Twitter, che hanno un limite di 150 richieste orarie.

@flod: come mai da Quick Cache sei tornato a WP-Super-Cache?

flod | #

@whiletrue
Scusa, mi ero perso la risposta ;-)

Quick Cache: ho l’impressione che sia più pesante in termini di utilizzo di memoria, ma è solo una sensazione.

Il mio problema principale è che pubblicando un post la pagina iniziale non viene aggiornata, per cui il cliente chiamava chiedendo perché lui vedesse l’articolo urgentissimo in home page e gli altri no (e, secondo problema, non essendo amministratore non poteva nemmeno utilizzare il pulsante per svuotare la cache).

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>