Transients en WordPress, mejorando la eficiencia

La guía completa de transients en WordPress

Sumérgete en el fascinante mundo de los transients en WordPress y descubre cómo esta funcionalidad clave puede marcar una diferencia notable en la velocidad y experiencia de tu sitio web.

Qué son los transients en WordPress

Los transients son unos elementos directamente emparentados con las options, básicamente son valores alojados en la base de datos que tienen una fecha de expiración automática.

Los transients se borran automáticamente

Normalmente, los transients se usan para almacenar información de forma temporal. Pero si queremos que no expiren también es posible hacerlo colocando el tiempo de expiración a 0.

Los transients y la base de datos

Los transients de WordPress son almacenados en la tabla options de la base de datos, añadiendo una fila extra para guardar la fecha de expiración.

Funciones relacionadas con los transients

La API de transients de WordPress nos facilita varias funciones.

Cómo crear y modificar transients

Podremos usar set_transient() para crear o actualizar un transient. Acepta los argumentos de nombre, valor y expiración. Si el transient existe en la base de datos tan solo se modificará el valor de expiración.

También contamos con la función set_site_transient() que estará disponible para un WordPress multisite.

Algo que debemos tener en cuenta es que los transients sin expiración, así como los creados a través de set_site_transient(), son autoloaded. Es decir, se cargarán cada vez que se cargue una página.

Cómo borrar transients

La función delete_transient() nos permitirá borrar un transient existente aportando tan solo el nombre del mismo como argumento.

También contamos con la función delete_site_transient() para borrar site transients.

Cómo obtener transients

get_transient() nos devolverá el valor del transient colocando el nombre del mismo como argumento. Lo mismo sucede con get_site_transient().

Cómo obtener el tiempo de expiración de un transient

Para obtener el tiempo de expiración no contamos con una función concreta. Lo que sí podemos hacer es obtener el  valor en option facilitando el nombre del transient a través de la función get_option() siguiendo la siguiente estructura _transient_timeout_ + el nombre del transient:

get_option( '_transient_timeout_nombre_de_transient', 0 );

Hooks y filtros relacionados con los transients

  1. setted_transient: Se ejecuta tras colocar el valor de un transient
  2. setted_site_transient: Tras colocar el valor de un site transient
  3. deleted_transient: Tras el borrado de un transient
  4. delete_site_transient: Tras el borrado de un site transient
  5. transient_{$transient}: Filtra el valor de un transient dado
  6. pre_transient_{$transient}
  7. set_transient_{$transient}: Se activa después de que el valor de un transient específico se ha colocado.
  8. site_transient_{$transient}: Filtra el valor de un transient dado
  9. delete_transient_{$transient}: Se ejecuta justo antes de que un transient es borrado
  10. pre_set_transient_{$transient}: Filtra el valor de un transient justo antes de que su valor haya sido creado/modificado
  11. pre_site_transient_{$transient}: Filtra el valor de un site transient justo antes de que su valor haya sido creado/modificado
  12. set_site_transient_{$transient}: Se ejecuta tras añadir el valor de un site transient
  13. delete_site_transient_{$transient}: Se ejecuta justo antes de que un site transient sea borrado
  14. pre_set_site_transient_{$transient}: Filtra el valor de un transient dado justo antes de ser añadido
  15. expiration_of_transient_{$transient}: Filtra la expiración de un transient justo antes de que su valor sea añadido
  16. expiration_of_site_transient_{$transient}: Filtra la expiración de un site transient justo antes de que su valor sea añadido

Duración de los transients

Como ya se explica más arriba, cada transient se aloja en la base de datos mediante 2 filas, una que almacena el valor y otra que almacena la expiración. Una vez que creamos un transient, al facilitar la expiración, podemos usar una serie de constantes facilitadas por WordPress. Estas son:

  • MINUTE_IN_SECONDS
  • HOUR_IN_SECONDS
  • DAY_IN_SECONDS
  • WEEK_IN_SECONDS
  • MONTH_IN_SECONDS
  • YEAR_IN_SECONDS

Ejemplo de uso de transients en WordPress

Estos pequeños «almacenes de datos» se utilizan para guardar resultados de consultas, API externas, datos calculados o cualquier otra información que pueda ser recuperada y utilizada repetidamente durante un período de tiempo determinado. Sabiendo esto podéis imaginaros un sinfín de posibilidades con las que trabajar. Por ejemplo, combinando la API de CRON en WordPress, junto con los transients podríamos crear un sistema que cada cierto tiempo revise y almacene lo que se quiere pintar en página.

En este ejemplo quiero que os imaginéis una web en la que se muestra el tiempo meteorológico de una ciudad concreta. Para obtener estos datos se realiza una llamada a una API externa, lo que supondría una llamada a la API cada vez que esa página se visitase. Mediante transients podríamos hacer una llamada a la API cada, por ejemplo, dos horas y así aligeraríamos considerablemente el tiempo de carga en un gran número de visitas.

<?php

//Función para hacer la llamada a la API del clima mediante Curl
function webheroe_call_curl($url, $data = null, $pass){

    $response = wp_remote_post( $url, array(
        'method' => 'POST',
        'headers' => array(
            'Content-Type: application/json',
            "Authorization: Bearer $pass",
        ),
    );

    $decoded_response = json_decode( $response, true );

    return $decoded_response;
}


function webheroe_check_api(){
    //Obtenemos el transient con los datos del clima
    $datos_clima_ciudad = get_transient( 'datos_clima_ciudad' );

    if ( false === $datos_clima_ciudad ) {
        // El transient ha caducado o no existe, realizar una nueva solicitud a la API
        $datos_clima_ciudad = webheroe_call_curl( 'https://miclima_api.com', 'WebHeroe_pAss' );

        //Creamos un transient con un tiempo de expiración de una hora
        set_transient( 'datos_clima_ciudad', $datos_clima_ciudad, HOUR_IN_SECONDS );
    }

    // Mostramos los datos del clima de la ciudad
    mostrar_datos_clima( $datos_clima_ciudad );
}
add_action( 'wp_head', 'webheroe_check_api' );

Transients y cache

Uno de los usos más comunes de los transients es el de almacenar llamadas a las bases de datos para así aligerar la carga de la página. En realidad existe otro método para hacer esto que, en la mayor parte de los casos es mucho más efectivo, el uso de Memcached. Memcached es un sistema de almacenamiento clave-valor desde el servidor creado precisamente para solucionar el mismo problema que con los transients. De hecho es un sistema mucho más rápido.

Transients o cookies

Hay situaciones en las que podemos no tener claro si usar transients o cookies para algún desarrollo particular. Debemos tener claro que con las cookies estaremos mucho más limitados en cuanto espacio de almacenamiento.

Una cookie creada en PHP tiene un límite de 4kb, mientras que el valor de un transient puede llegar hasta los 4Gb según su tipo en la base de datos, longtext. Sin embargo, el nombre de un transient está limitado a 191 caracteres, varchar(191).

Por ejemplo, podríamos serializar un array muy grande sin tener ningún problema al almacenarlo como transient, mientras que en una cookie no.

Los transients y WP-CLI

WordPress también nos facilita una serie de comandos para gestionar los transients desde la consola. Entre ellos encontramos:

  • wp transient set
  • wp transient get
  • wp transient delete
  • wp transient delete –expired
  • wp transient delete –all
  • wp transient list
  • wp transient cache

Plugins sobre transients

Deja un comentario

    Explícanos tu proyecto, nos pondremos en contacto contigo brevemente


    contacto@webheroe.com