Cómo limpiar transients expirados

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 🙂



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *