set_transient / get_transient în WordPress

Opțiuni, cache și API WordPress 2.8

Transients API păstrează temporar un rezultat costisitor (un apel HTTP, o interogare), cu durată de expirare în secunde.

Sintaxă
set_transient( string $transient, mixed $value, int $expiration = 0 ): bool
get_transient( string $transient ): mixed
delete_transient( string $transient ): bool

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ă ca 0 sau '' ar fi tratată ca lipsă. Compară strict cu false.
  • 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.