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.