Usando la API de Transients en WordPress

WordPress tiene varias API’s muy interesantes y prácticas, aunque no todas ellas son igual de conocidas.

Una de las que he venido a conocer más recientemente es la API de Transients, que permite trabajar con datos temporales de un modo simple y estándar, lo que resulta ideal si quieres crear una caché de datos con un tiempo de expiración, por ejemplo, al realizar consultas muy complejas a la base de datos o al obtener datos desde una fuente externa.

Esta API trabaja de forma muy similar al API de opciones, pero con el agregado de un tiempo de expiración de los datos, tras el cual WordPress eliminará la información almacenada en la base de datos. En nuestro plugin/widget/clase/función podremos implementar los métodos necesarios para chequear si existe el contenido cacheado o bien refrescar los datos, según sea necesario. La API implementa tres funciones que nos permiten guardar, obtener, o eliminar los datos, respectivamente:

/**
 * Guardar datos a la base de datos
 * @param string $transient Nombre del transient
 * @param mixed $value Datos que se guardarán. WordPress detecta si es un string o datos más complejos, y en este caso los guardará automáticamente como datos serializados
 * @param int $expiration El tiempo de expiración, en segundos.
 * @return boolean Verdadero o falso, de acuerdo a si la operación se ha realizado
 **/
set_transient($transient, $value, $expiration);

/**
 * Obtener datos
 * @param $transient string Nombre del transient.
 * @return mixed Los datos del transient, ya sea como string, como array u objeto si eran datos serializados, o bien falso si los datos no existen.
 **/
get_transient($transient);

/**
 * Borrar datos, para cuando se quieran borrar antes del tiempo de expiración
 * @param $transient string Nombre del transient
 * @return boolean Verdadero o falso, de acuerdo a si la operación se ha realizado
 **/
delete_transient($transient);

De este modo, en nuestro plugin/widget/función/etc. sólo nos bastará comprobar si los datos ya existen y refrescarlos en caso que sea necesario:

function mi_funcion(){
	global $wpdb;
	$transient_data = get_transient('mis_datos');
	if ( ! $transient_data ) {
		// Obtener los datos
		$get_data =  json_decode( file_get_contents( 'http://search.twitter.com/search.json?q=from%3Afelipelavinz' ) );
		// Guardarlos en el transient
		if ( set_transient('mis_datos', $get_data, 3600) ) $transient_data = $get_data;
	}
	foreach ( $transient_data as $key=>$val ) {
		// Procesar los datos
	}
}

Una buena manera de mejorar la performance de tus plugins/widgets/funciones.

4 thoughts on “Usando la API de Transients en WordPress

  1. Está muy interesante, ¿se puede utilizar esta API para realizar consultas vía AJAX y cachear los datos? He estado viendo opciones de como cachear consultas AJAX para optimizar la carga en sitios con muchas visitas y esta parece ser una buena alternativa, ¿sabes si los plugins de caché de WordPress (W3 Total Cache o WP Super Cache) consideran esta API en su sistema de cacheo?

    1. Hola Pablo:

      La función del API de transients es solamente la parte de cachear datos, ya sea de consultas a una API externa, consultas muy complejas, etc. Por ejemplo, si el sitio carga una colección de fotos desde el API de Flickr, normalmente realizarías una petición a Flickr por cada visita en tu sitio; con transients lo que puedes hacer es cachear temporalmente la respuesta del API de Flickr y luego utilizar los datos que tienes en esa caché.

      Para cachear las consultas en AJAX, una alternativa controlar su expiración a través de cabeceras HTTP, como incluir un eTag y especificar expires.

      Es una API interna de WordPress, por lo que debe funcionar con W3TC y WPSC. Si no tienes un sistema de caché de objetos externo (memcached, APC, XCache), la información se guarda en base de datos, en la tabla $wpdb->options; y si lo tienes, se utiliza el caché de objetos.

      Saludos!

    2. Muchas gracias por la respuesta! ¿pero que pasa en el caso de hacer consultas AJAX directamente a la base de datos de WordPress? en ese caso no hay un archivo o algo a lo que añadirle un expire (creo) ¿conviene en ese caso guardar el resultado de la consulta en un archivo json o similar para manejar el cacheo desde ahí? [espero no estar abusando de tu buena voluntad, es un tema relativamente nuevo para mi]

    3. ¡No es ningún abuso! De hecho, tengo unos borradores por ahí que quizás valdría la pena desempolvar.

      Ahora, sobre tu consulta: idealmente, cuando estás haciendo una consulta por AJAX a WordPress, mandas una petición a wp-admin/admin-ajax.php con los parámetros indicados para obtener la información que necesitas, y WordPress envía una respuesta, que puede ser JSON, HTML, texto plano, etc. Es en esa respuesta que puedes especificar las cabeceras HTTP que corresponden, pero no lo haces a través de la configuración del servidor (.htaccess) sino al generar la respuesta desde PHP, por medio de la función header( )

      Slds!

Comments are closed.

%d bloggers like this: