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_optionsinflada 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 🙂 |
