
Optimización de la tabla wp_options y eliminación de datos transitorios
La tabla wp_options es crítica para el rendimiento de WordPress. Cuando los transients y opciones acumuladas crecen, la carga de las páginas baja y aumentan las consultas lentas. En esta guía técnica y práctica veremos cómo analizar, limpiar y optimizar wp_options sin romper el sitio: consultas SQL seguras, alternativas con PHP y WP-CLI, y estrategias de prevención.
Por qué la tabla wp_options puede crecer y afectar el rendimiento
WordPress y muchos plugins usan transients para cachear temporalmente datos en la base de datos. Los transients se guardan en wp_options y, cuando no se eliminan correctamente al expirar (por fallos de cron o errores de plugin), pueden acumularse. Otras causas comunes:
- Plugins mal diseñados que crean opciones con
autoload = 'yes'y valores grandes. - Fallas en el mecanismo de limpieza de transients (WP-Cron deshabilitado o baja actividad).
- Registros de configuración o datos temporales escritos como opciones sin control.
Antes de tocar nada: análisis y copia de seguridad
Siempre actúa con precaución. Un error puede romper el front-end o el admin.
- Haz una copia de seguridad completa de la base de datos (dump SQL).
- Trabaja en staging cuando sea posible.
- Verifica la versión de MySQL/MariaDB y PHP para compatibilidades.
Para entender el tamaño y el autoload de wp_options, usa consultas de diagnóstico (ejemplos abajo). Si usas MySQL, la documentación de MySQL es útil para entender operaciones como OPTIMIZE TABLE.
Consultas SQL esenciales para diagnóstico
Conéctate a la base de datos con privilegios de lectura (o desde tu herramienta preferida) y ejecuta estas consultas para medir el problema.
1) Contar opciones y ver las más grandes
SELECT COUNT(*) AS total_options FROM wp_options;
SELECT option_name, OCTET_LENGTH(option_value) AS bytes
FROM wp_options
ORDER BY bytes DESC
LIMIT 25;
2) Opciones con autoload = ‘yes’
SELECT COUNT(*) AS autoload_yes, SUM(OCTET_LENGTH(option_value)) AS autoload_bytes
FROM wp_options
WHERE autoload = 'yes';
Opciones cargadas automáticamente impactan el tiempo de respuesta de PHP porque se cargan en cada petición.
3) Encontrar transients
Los transients se guardan con nombres que comienzan por _transient_ o _site_transient_. Para detectar su cantidad:
SELECT COUNT(*) AS transients_count
FROM wp_options
WHERE option_name LIKE '\_transient\_%' ESCAPE '\'
OR option_name LIKE '\_site_transient\_%' ESCAPE '\';
Nota: las barras invertidas en el patrón escapan el guion bajo para tratarlo como carácter literal.
Limpieza segura de transients
Hay varias formas: WP-CLI, funciones PHP, o SQL directo. Elige la que mejor se adapte a tu experiencia y entorno.
Opción A: Usar WP-CLI (recomendado para entornos controlados)
WP-CLI incluye comandos para manejar transients y es seguro porque ejecuta la API de WordPress:
wp transient delete --all— elimina transients a nivel de site.wp transient delete --expired— borra solo los transients caducados.
Ejecuta en mantenimiento o en staging. WP-CLI respeta la lógica de WordPress, evitando eliminar opciones vitales.
Opción B: Usar funciones PHP en un mu-plugin o script de mantenimiento
Si no usas WP-CLI, puedes ejecutar una rutina PHP segura que borre transients expirados:
<?php
// Ejecutar este script desde WP-CLI eval o como mu-plugin temporal
global $wpdb;
$expired = $wpdb->get_col("SELECT option_name FROM $wpdb->options
WHERE option_name LIKE '\\_transient\\_%' ESCAPE '\\'");
foreach ($expired as $name) {
if (strpos($name, '_transient_timeout_') === false) {
// eliminar sólo valores, no timeouts
$wpdb->query($wpdb->prepare("DELETE FROM $wpdb->options WHERE option_name = %s", $name));
}
}
?>
Advertencia: evita ejecutar borrados masivos sin pruebas. Mejor limitar el batch y verificar integridad.
Opción C: SQL directo (riesgo mayor, usar con backup)
Un método común —y más peligroso— para eliminar transients caducados es usar SQL. Ejecuta sólo si tienes respaldo:
DELETE FROM wp_options
WHERE option_name LIKE '\_transient\_%' ESCAPE '\'
OR option_name LIKE '\_site_transient\_%' ESCAPE '\';
Esta consulta borra todos los transients (activos y expirados). Si prefieres eliminar sólo transients con timeout expirado, la lógica se complica porque WordPress guarda timeouts en opciones con prefijo _transient_timeout_. Un ejemplo más selectivo:
DELETE o FROM wp_options o
LEFT JOIN wp_options t ON t.option_name = REPLACE(o.option_name, '_transient_', '_transient_timeout_')
WHERE (o.option_name LIKE '\_transient\_%' ESCAPE '\' OR o.option_name LIKE '\_site_transient\_%' ESCAPE '\')
AND t.option_value < UNIX_TIMESTAMP();
Prueba primero con SELECT para revisar qué filas se eliminarán.
Optimizar la tabla después de limpiar
Después de eliminar muchas filas, ejecuta:
OPTIMIZE TABLE wp_options;
Esto recupera espacio y mejora el rendimiento en tablas MyISAM o InnoDB según configuración. Consulta la documentación de MySQL para detalles de comportamiento en tu versión.
Buenas prácticas para evitar la recurrencia
- Revisa plugins que usan autoload = ‘yes’ y grandes valores; cambiar a autoload = ‘no’ cuando sea posible.
- Implementa un sistema de cache persistente (Redis o Memcached) para reducir escrituras en BD y almacenar transients fuera de la base de datos.
- Controla la ejecución de tareas cron y asegúrate de que WP-Cron funcione o sustituir por cron real.
- Audita regularmente la tabla con consultas automatizadas y alertas para crecimiento anómalo.
El uso de cache persistente se apoya en conceptos de PHP y serialización; la documentación de PHP ayuda a entender cómo se almacenan los valores en la base de datos.
Consideraciones de seguridad y rendimiento
- No ejecutes consultas DELETE sin backup y sin probar en staging.
- Si tu sitio es de alta concurrencia, realiza estas operaciones en ventanas de baja carga.
- Monitoriza tiempos de consulta y uso de CPU durante la limpieza.
Checklist rápido para la acción
- 1) Backup completo de la base de datos.
- 2) Ejecutar consultas de diagnóstico y revisar opciones con autoload.
- 3) Usar WP-CLI o script PHP para eliminar transients caducados.
- 4) Si se elimina en masa, ejecutar
OPTIMIZE TABLE wp_options. - 5) Implementar caching persistente y revisar plugins problemáticos.
Conclusión
La optimización de wp_options y la eliminación de transients es una tarea crítica y delicada que puede devolver velocidad y estabilidad a un sitio WordPress. Prioriza el análisis previo, realiza copias de seguridad y prefiere métodos que utilicen la API de WordPress (WP-CLI o funciones PHP) para minimizar riesgos. Tras la limpieza, optimiza la tabla y adopta prácticas permanentes: revisar autoload, activar cache persistente y controlar el cron. Con estas acciones reducirás latencia, consultas lentas y problemas de escalabilidad.
Lecturas relacionadas: documento de MySQL sobre mantenimiento de tablas y la referencia de PHP sobre serialización, así como la guía de MDN sobre buenas prácticas de caching que también ayudan a reducir carga en la base de datos.