Transient per WordPress: guida all’uso

Pubblicità

Cosa sono i transient di WP

Sono una tecnica per ridurre il numero di hit sul database di un sito in WordPress, in modo da ridurre (spesso in modo impercettibile) i tempi di caricamento della pagina. In pratica ogni porzione di codice con WP_Query o con chiamate SQL in lettura (ad esempio estrazione di contenuti dal loop) possono essere alleggerite salvando la prima volta i risultati e ripescandoli, in forma serializzata, le volte successive dal database. Ai WP Transient viene inoltre associato anche un tempo massimo di durata, superato il quale il transient viene ri-generato per la volta successiva.

A livello pratico, i transient di WP agiscono su una tabella virtuale fatta di coppie (chiave, valore), con una data di scadenza massima annessa ad essi ed impostabile dall’utente. Scaduto il tempo massimo, saranno ricalcolate nuovamente in automatico, emulando il funzionamento delle wp_options e riproducendone parte dei potenzili problemi di ottimizzazione spaziale (in breve: i dati occupano spazio, alla lunga, e vanno ripuliti periodicamente).

Come funzionano i transient

Il meccanismo dietro i transient di WordPress (in italiano “transitori”, per quanto sia più comune lasciare questo termine in inglese) è probabilmente uno dei più potenti disponibili per questo CMS, tanto che meriterebbe di essere trattato a parte all’interno delle fasi di ottimizzazione del sito WP. Cosa che non ho fatto, a conti fatti, perchè non tutti sono programmatori e non tutti dispongono di un programmatore per effettuare questo genere di operazioni, motivo per cui in molti casi i transient sono semplicemente trascurati. In effetti numerosi plugin ne fanno uso, ad ogni modo, in quanto permettono di  velocizzare notevolmente WordPress e sono una tecnica di ottimizzazione del codice decisamente pratica e sicura.

A cosa servono i transient di WP

In breve, cosa fanno i wp transient? Essi permettono di definire varie aree del database (identificate da un’etichetta unica) come se fossero cache, in modo da pre-calcolare il risultato di una query, salvarla e poterla infine recuperare all’occorrenza. I siti che scrivono ogni tanto e leggono parecchio – esempio pratico: un blog molto visitato e poco aggiornato –  possono trarre molto giovamento da questa politica. Un po’ come avviene per i cookie, solitamente ad un transient è attivata una “data di scadenza“, che indica la durata massima dello stesso. Questo per una ragione molto naturale: se, ad esempio, imposto un transient per le ultime notizie in home, se faccio un aggiornamento oggi e la data di scadenza non è ancora arrivata, continuerò a vedere i vecchi dati (andando a vantaggio dell’efficenza della query, ma non della sua “attualità”, quindi). Motivo per cui impostarli (e farne uso in modo saggio) richiede un minimo di skill di programmazione e di buon senso, ed in questo articolo farò un po’ di esempi pratici di uso degli stessi.

Come si usano i transient di WP

Come si usano i transient è presto detto: le funzioni principali da conoscere sono due, set_transient(etichetta, valore, durata) e get_transient(etichetta). La prima imposta la cache sull’oggetto identificato dall’etichetta – che può essere, tipicamente, il risultato di un WP_Query – mentre  la seconda ottiene il valore rapidamente sulla base della label specificata (che deve essere ovviamente univoca in tutto il codice).

Il pattern standard da sfruttare viene dal Codex, ed è il seguente:

if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
  $special_query_results = new WP_Query( 'cat=5&order=random&tag=tech&post_meta_key=thumbnail' );
  set_transient( 'special_query_results', $special_query_results, $special_query_results );
}

Il suo significato è presto detto (vale per WP_QUEry ma qualsiasi altro risultato può essere memorizzato e messo in questa sorta di cache temporanea, anche se non è corretto chiamarla cache, vedi fine articolo): se esiste un transient per quella variabile, cioè se quella query è già stata fatta negli ultimi $x secondi, allora passa oltre perchè il valore lo ha già ottenuto mentre verificava la condizione.  Se invece non esiste entra nell’if, imposta il valore come desiderato (ad esempio: per popolare un carousel / slider, per mostrare i primi 20 articoli in home ecc.) ed imposta il transient con quell’etichetta per la volta successiva. Può sembrare un meccanismo contorto ma, a ben vedere, è facile intuire che non lo è davvero, se non forse per quella condizione iniziale if non proprio leggibile per chi ha meno esperienza con queste cose. Tenete conto, comunque, che se lavorate solo su query testuali (senza immagini o video) di poche righe il beneficio del transient potrebbe non cogliersi affatto, per cui sappiate anche decidere dove e quando farne uso.

Come esempio pratico, ho usato pesantemente i transient in un sito di gallerie fotografiche su cui sto lavorando in questi mesi, con il risultato di dimezzare, in media, il numero di query eseguite, e di abbattere i tempi di caricamento della home da quasi 8 secondi a meno di un secondo. Chiaro che, in questo caso, si è trattato di un’ottimizzazione tutt’altro che superflua, visto che all’occhio del cliente il sito “è lento” e “non carica la home“, mentre invece ora (con qualche accorgimento extra, come il lazy loading per la visualizzazione) i tempi sono decisamente più accettabili e, oserei dire, più nella norma.

Equivoci sui transient di WordPress

I transient sono bellissimi e molto utili, ma vengono spesso fraintesi ed usati in modo diverso: io stesso, fino a qualche tempo fa, non avevo ben capito alcune cose riguardo ad essi. Per intenderci:

  • i transient sono un tipo di cache, non una forma di data storage (come la object cache, ad esempio)
  • i transient non è detto che siano, sempre e comunque, memorizzati nel database (questo è molto importante da sapere)
  • i transient, soprattutto, hanno una scadenza massima, non minima, per cui non si tratta di una scadenza garantita
  • i transient, inoltre, potrebbero essere cancellati da WP (mediante cron, funzioni di sistema oppure aggiornamenti di core e plugin) prima del tempo di scadenza che impostiamo.

Ricordiamoci quindi, quando usiamo i transient, che.

  1. se usate plugin di cache in modo scorretto, è possibile che i transient abbiano un comportamento imprevedibile;
  2. la data di scadenza è massima, non minima: quindi non è detto che venga rispettata alla lettera.

Quando usare i transient

I transient sono ideali per memorizzare brevemente dati in forma persistente, senza ricalcolarli ogni volta e fermo restando quando scritto sopra.

Photo by Sean MacEntee

0 voti