Ce face set_transient / get_transient
Un transient este o valoare „de cache” cu termen de valabilitate. set_transient() o salvează pentru $expiration secunde, get_transient() o citește și întoarce false dacă lipsește sau a expirat, iar delete_transient() o șterge înainte de termen. Toate trei există din WordPress 2.8.0.
Fără un object cache persistent (Redis, Memcached), transients se păstrează în tabelul wp_options, pe rânduri cu prefixele _transient_ și _transient_timeout_. Cu un object cache activ ajung în memoria acestuia. Numele trebuie să aibă cel mult 172 de caractere; numele mai lungi eșuează fără niciun mesaj.
Un transient poate dispărea și înainte de expirare (de exemplu când se golește cache-ul), deci codul tău trebuie să poată reface oricând valoarea. Cu $expiration = 0 transientul nu expiră și este încărcat automat (autoload) la fiecare cerere; cele cu expirare nu sunt autoload. Pentru durate poți folosi constantele MINUTE_IN_SECONDS, HOUR_IN_SECONDS, DAY_IN_SECONDS.
Parametri
| Parametru | Descriere |
|---|---|
$transient |
Numele transientului, maxim 172 de caractere, fără escaping SQL. Pune un prefix (dex_). |
$value |
Valoarea de păstrat; tablourile și obiectele sunt serializate automat. |
$expiration |
Durata în secunde. 0 (implicit) = fără expirare. |
Ce returnează
get_transient() întoarce valoarea sau false dacă transientul lipsește ori a expirat; set_transient() și delete_transient() întorc true la succes, false altfel.
Exemple
Exemplul 1: Cursul valutar păstrat o oră
Dacă transientul lipsește, facem apelul HTTP și salvăm rezultatul pentru o oră. Comparăm cu === false, pentru că o valoare validă poate fi și 0.
<?php
function dex_curs_eur() {
$curs = get_transient( 'dex_curs_eur' );
if ( false === $curs ) {
$raspuns = wp_remote_get( 'https://api.exemplu.ro/curs?moneda=EUR' );
if ( is_wp_error( $raspuns ) ) {
return null;
}
$date = json_decode( wp_remote_retrieve_body( $raspuns ), true );
$curs = (float) $date['valoare'];
set_transient( 'dex_curs_eur', $curs, HOUR_IN_SECONDS );
}
return $curs;
}
echo '<p>1 EUR = ' . esc_html( dex_curs_eur() ) . ' lei</p>';
Ce afișează pagina
<p>1 EUR = 4.97 lei</p>
Exemplul 2: Ștergerea cache-ului când se publică un articol
Lista ultimelor articole din Iași e păstrată 12 ore, dar o ștergem cu delete_transient() la fiecare salvare de articol, ca să nu rămână veche.
<?php
function dex_articole_iasi() {
$titluri = get_transient( 'dex_articole_iasi' );
if ( false === $titluri ) {
$titluri = wp_list_pluck(
get_posts( array( 'category_name' => 'iasi', 'numberposts' => 5 ) ),
'post_title'
);
set_transient( 'dex_articole_iasi', $titluri, 12 * HOUR_IN_SECONDS );
}
return $titluri;
}
function dex_goleste_cache_iasi() {
delete_transient( 'dex_articole_iasi' );
}
add_action( 'save_post', 'dex_goleste_cache_iasi' );
Exemplul 3: Ștergerea din terminal cu WP-CLI
Același transient se poate șterge și din terminal, de exemplu după o modificare făcută direct în baza de date.
wp transient delete dex_curs_eur
Ieșire în terminal
Success: Transient deleted.
Greșeli frecvente
- Să presupui că transientul există sigur până la expirare: poate dispărea oricând, deci verifică mereu
false === get_transient( ... )și refă valoarea. - Să folosești
if ( ! $valoare ): o valoare salvată ca0sau''ar fi tratată ca lipsă. Compară strict cufalse. - Nume mai lungi de 172 de caractere (de exemplu cu un URL întreg în nume): salvarea eșuează fără mesaj. Folosește
md5()pe partea variabilă. - Transients fără expirare pentru date mari: sunt autoload și se încarcă la fiecare cerere.
Comenzi înrudite
get_option / update_option: Citesc, salvează și șterg setări permanente ale site-ului în tabelul wp_options (Options API).wp_remote_get: Face cereri HTTP din PHP prin HTTP API-ul WordPress și întoarce un tablou cu răspunsul sau un obiect WP_Error.wp-config.php: constante: Fișierul de configurare al WordPress: datele bazei de date, prefixul tabelelor, cheile de securitate, adresele site-ului și alte constante.