Contents
Introducción a los transients en WordPress
Los transients son una API nativa de WordPress diseñada para almacenar datos temporales en la base de datos o en un sistema de caché persistente (como Memcached o Redis). Cada transient se guarda con un identificador único y una fecha de expiración, pasada la cual debería borrarse automáticamente. Sin embargo, en entornos de alta carga o configuraciones especiales, los transients expirados pueden acumularse y afectar al rendimiento de la web.
¿Por qué limpiar transients expirados
- Rendimiento de la base de datos: Una tabla
wp_options
inflada con miles de registros de transients caducados altera las consultas. - Consumir espacio en disco: Si utilizas la base de datos local, la tabla crecerá sin necesidad.
- Problemas de lógica: Plugins o temas que consultan todos los transients podrían procesar datos obsoletos.
Métodos de limpieza de transients expirados
1. Uso de WP-CLI
WP-CLI es la herramienta de línea de comandos para WordPress. Para borrar transients expirados:
wp transient delete-expired
Este comando detecta y elimina todos los transients cuyo tiempo de expiración ha pasado.
2. Consulta SQL directa
Si prefieres operar directamente sobre la base de datos:
DELETE FROM wp_options WHERE option_name LIKE _transient_% AND option_name NOT LIKE _transient_timeout_% AND option_id IN ( SELECT option_id FROM wp_options WHERE option_name LIKE _transient_timeout_% AND option_value < UNIX_TIMESTAMP() )
Este script borra las entradas de wp_options
que son transients expirados y no las claves de tiempo de expiración.
3. Función personalizada en el tema o plugin
Puedes automatizar la limpieza con una función PHP usando wp_schedule_event:
/ Borra transients expirados manualmente. / function limpiar_transients_expirados() { global wpdb sql = DELETE o, t FROM {wpdb-gtoptions} o INNER JOIN {wpdb-gtoptions} t ON o.option_name = REPLACE(t.option_name, _transient_timeout_, _transient_) WHERE t.option_name LIKE _transient_timeout_% AND t.option_value < UNIX_TIMESTAMP() wpdb->query(sql) } // Programar evento si no existe. if (!wp_next_scheduled(cron_limpiar_transients)) { wp_schedule_event(time(), daily, cron_limpiar_transients) } add_action(cron_limpiar_transients, limpiar_transients_expirados)
Este snippet programa una tarea diaria que borra automáticamente los transients caducados.
4. Plugins especializados
Existen plugins que facilitan la gestión de transients:
Plugin | Función principal | Enlace |
---|---|---|
Transients Manager | Listar y borrar transients manualmente | Página oficial |
WP Rocket | Limpieza automática integrada | Sitio web |
Buenas prácticas y recomendaciones
- Evita eliminar transients en producción sin pruebas previas: Siempre prueba en un entorno staging para verificar que no se borren datos aún válidos.
- Define caducidades adecuadas: No todas las piezas de datos requieren un timeout muy corto ajusta según la frecuencia de actualización requerida.
- Supervisa el tamaño de la tabla wp_options: Un crecimiento inesperado indica posibles leaks de transients.
- Configura tu cache persistente correctamente: Usar Redis o Memcached descarga la base de datos y gestiona mejor la expiración de claves.
- Registra logs de limpieza: Si automatizas el proceso, guarda un registro (por ejemplo, en un archivo o una tabla personalizada) para auditar qué transients se borraron y cuándo.
Soluciones avanzadas
Limpieza por lotes con WP_Async_Request
Para evitar timeouts, puedes procesar la limpieza en segundo plano. Ejemplo usando la librería WP_Async_Request:
class Async_Clean_Transients extends WP_Async_Request { protected action = clean_transients_async protected function task( data ) { global wpdb // Query similar al anterior, pero con un LIMIT para procesar por lotes. wpdb->query( DELETE o, t FROM {wpdb-gtoptions} o INNER JOIN {wpdb-gtoptions} t ON o.option_name = REPLACE(t.option_name, _transient_timeout_, _transient_) WHERE t.option_name LIKE _transient_timeout_% AND t.option_value < UNIX_TIMESTAMP() LIMIT 1000 ) return data } } // Disparar limpieza asíncrona clean = new Async_Clean_Transients() clean->dispatch()
Integración con health checks y alertas
Puedes usar Site Health y agregar un chequeo personalizado:
add_filter(site_status_tests, function(tests) { tests[direct][transients_size] = [ label => __(Tamaño de la tabla de transients,textdomain), test => function() { global wpdb count = wpdb->get_var( SELECT COUNT() FROM {wpdb->options} WHERE option_name LIKE _transient_% ) if (count > 5000) { return [ label => __(Demasiados transients,textdomain), status => recommended, badge => [label => __(Performance,textdomain), color => yellow], description => __(Hay más de 5.000 transients. Considera limpiarlos.,textdomain), test => transients_size, actions => [ [label => __(Limpiar ahora,textdomain), url => wp_nonce_url(admin_url(tools.phppage=transients-manager),clean)] ] ] } return [ label => __(Transients bajo control,textdomain), status => good, ] } ] return tests })
Conclusiones
La gestión adecuada de transients expirados es clave para mantener óptimo el rendimiento de WordPress. Desde soluciones sencillas como WP-CLI o SQL directo, hasta implementaciones avanzadas con procesos en segundo plano, tienes diversas estrategias adaptables a tu proyecto. Recuerda siempre:
- Hacer una copia de seguridad antes de ejecutar borrados masivos.
- Configurar caducidades realistas.
- Monitorear el estado de tu base de datos y caché.
Para más información, consulta la documentación oficial de WordPress en Transients API.
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |