Cerrar
Image Alt

Caché de datos en WordPress (1): Transients API

Cada vez que nuestra web necesita datos tiene que hacer una llamada a su base de datos para conseguirlos. Por ejemplo, imaginad que necesitamos todas aquellas entradas personalizadas del tipo «producto» cuyo campo personalizado «color» no sea «azul»:

Esto supone una llamada a la base de datos, con el consumo de recursos y de tiempo correspondiente. Y si tenemos muchos visitantes tenemos que hacer esta llamada una y otra vez. Esto afecta al rendimiento de nuestra página, y si la llamada a la base de datos es muy compleja puede hasta tirarnos abajo la web si tenemos un tráfico de visitantes muy grande para el que no estamos preparado:

Pero, ¿y si sólo bastara con la primera vez que se accede a la dase de datos y guardáramos los resultados para el resto de usuarios (luego veremos donde) durante un tiempo determinado?

Eso es lo que conseguimos con dos herramientas muy valiosas que nos ofrece WordPress: el Transients API y el caché de objetos. En este artículo veremos el Transients API. En el siguiente veremos el caché de objetos con wp_cache.

Transients API

El Transients API nos permite almacenar información para usarla posteriormente, mejorando el rendimiento de tu página.

¿Dónde se guardan los datos cuando usamos el Transients API? En principio se guardan en la misma base de datos, en la tabla wp_options. Estaréis pensando que vaya un sistema de caché que para evitar llamadas a la base de datos guarda los resultados otra vez en la base de datos… Pues sí, es cierto. Aunque hay mejora, ya que guarda el resultado, por lo que la llamada a la base de datos será ahora más sencilla.

Pero para aprovechar realmente el Transients API debemos utilizar algún plugin como W3 Total Cache. ¿Por qué? porque en este caso los resultados ya no se almacenan en la base de datos, sino en una memoria rápida. Por esta razón los desarrolladores de WordPress nos recomiendan que usemos transients para almacenar información que va a caducar con el tiempo. También debemos recordar en este caso que los datos del transients no se van a volver a almacenar en la base de datos, por lo que no debemos intentar obtenerlos de la misma.

También podemos utilizar el Transients API para almacenar información externa a nuestra web, ya que hay veces que lo que demora la carga de la misma puede ser el conectar con un servidor externo. Por ejemplo, podemos almacenar usando el Transients API información procedente de Facebook, de Twitter, etc..

Funciones del Transient API

¿Cómo usamos el Transients API? Pues la gran ventaja es que es muy facil de usar. Hay que usar dos funciones: set_transient() para crear el transient y get_transient() para obtenerlo. Para WordPress multiusuario tenemos también set_site_transient(), que crea el transient para toda la red, y get_site_transient(), que te permite obtenerlo en cualquier parte de la red.

Hay otra función importante: delete_transient() o delete_site_transient(), que permite borrar el transient. Esto es útil cuando queremos que la información se refresque porque hay nuevas entradas. Borramos el transient y así hacemos que se regenere con la nueva información.

Un ejemplo

Vamos a seguir con el ejemplo de más arriba. Supongamos que queremos utilizar el Transients API para almacenar la información resultante de esa llamada a la base de datos. Habría que modificar un poco el código, como veréis a continuación:

Vamos a ver línea a línea:

  • En la línea 2 usamos la función get_transient() para obtener el transient llamado «productos». En el caso de que no exista, el resultado que nos va a dar será «FALSE», por eso ponemos el condicional. Si es FALSE (porque hemos borrado el transient o porque el mismo ha caducado) tenemos que volver a generarlo. Es decir, una vez caducado o borrado el transient, al entrar un nuevo usuario en la web se hará otra vez la llamada a la base de datos y se creará de nuevo el transient.
  • En las líneas 4 a 15 generamos el query tal y como lo haríamos normalmente.
  • En la línea 16 usamos la función set_transient() para generar el nuevo transient. Como veis, esta función necesita de varios parámetros: En primer lugar el nombre que le vamos a dar a este transient concreto. El nombre debe tener menos de 45 caracteres. En segundo lugar, el valor que se da a dicho transient, que en nuestro caso es el resultado del query. En tercer lugar (opcional), el tiempo que queremos que dure el transient en segundos. Por ejemplo para un día sería: ( 60 * 60 * 24 ). En nuestro ejemplo lo mantenemos 10 minutos.
  • En la línea 20 comenzamos el loop como lo haríamos normalmente.

WordPress 3.5 ha añadido nuevas variables para facilitarnos las cosas:

MINUTE_IN_SECONDS = 60 (segundos)
HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS
DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS
WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS
YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS

Ejemplo:

Quiero borrar el transient

¿Qué sucede si la información se renueva (por ejemplo porque hay una nueva entrada que mostrar) y el transient está aún activo? Pues que esa nueva entrada no se mostrará hasta que 1) Caduque el transient o 2) Borremos el transient para generar uno nuevo que incluya esa nueva entrada. Para borrar el transient usamos la función delete_transient(‘nombre-del-transient’).

WordPress nos ofrece este ejemplo, en el que añadiremos una función a la acción ‘edit_term’, que se ejecutará cada vez que se edite una categoría o una etiqueta (asumimos que dicha actualización invalida nuestros datos por lo que queremos eliminar la información que hay en caché):

Otro ejemplo donde podemos poner la función delete_transient. Supongamos que en functions.php hemos creado un campo personalizado. Por ejemplo, un metabox repetible para incluir imágenes. Si veis el ejemplo de ese artículo, podemos añadir la función delete_metabox() cada vez que se grabe un nuevo valor, es decir, dentro de la función save_custom_meta():

Y a la hora de obtener las imágenes haríamos ahora:

Otros ejemplos del Transients API

Os recomiendo a continuación una serie de artículos con tutoriales y ejemplos muy útiles de uso del Transients API:
WordPress Transients API – Practical examples
WordPress Transients API caching benchmarks
Website Speed Part 3 – Caching WordPress

Comentarios

  • Muy interesante, tomo nota.
    Aunque considero que antes de esto pueden hacerse gran cantidad de cosas.
    A modo freelance me dedico a optimizar (acelerar) webs, y la mayoría de casos bajo wordpress que me he encontrado, el problema no estaba en la Base de datos. Algo fácilmente comprobable hasta desde el lado cliente, viendo las latencias desde el establecimiento de conexión, hasta la llegada del primer byte.
    Trabajando a nivel de Theme siguiendo las directrices del test Google Speed Page, de configuración del webserver, mejorando la programación Javascript y añadidendo el W3 Total Cache he llegado a triplicar la velocidad de carga de algunos webs.

    Una vez hecho todo esto, bien es cierto que cuanto «mas azucar mas dulce».

    Gracias por la información

    22 mayo, 2012
    contestar
  • Una pregunta, ¿sabes como puedo borrar todos los transients de la base de datos?

    Tengo una página donde la cambiamos el tema por uno mas sencillo, el tema anterior sobrecargaba el servidor con cientos de procesos algunos eran innecesarios para la finalidad de la página, entonces cambiamos el tema, pero notamos que la base de datos estaba algo «crecida» y mirando encontramos cientos, tal vez miles de registros de transients y la verdad es un poco molestoso ir directo a la base de datos a borrarlos. ¿Existe un plugin o algo que los elimine fácilmente?

    3 junio, 2013
    contestar
  • La verdad mi página web hecha en worpdress tiene muchas entradas de este tipo en la tabla wp_options y se llena al tope que colapsa la web y toca reiniciar el servidor mysql, cual puede ser una solución para este problema?

    22 marzo, 2016
    contestar

Escribe un comentario