
Si tienes WooCommerce, tienes un programador de tareas escondido. Se llama Action Scheduler (en el escritorio, «Acciones programadas») y lo usan WooCommerce y muchos otros plugins para hacer cosas en segundo plano: enviar correos, sincronizar inventario, procesar suscripciones, limpiar carritos abandonados.
Funciona muy bien hasta que algo se atasca. Entonces empieza a acumular tareas fallidas y registros, y no es raro encontrar tiendas con millones de filas en esas tablas. El síntoma: un escritorio cada vez más lento, respaldos que pesan el doble y consultas que tardan sin razón aparente.
Cómo saber si te pasa
Entra a WooCommerce → Estado → Acciones programadas (o Herramientas → Acciones programadas). Arriba verás contadores por estado:
- Pendiente: tareas que esperan su turno. Unas decenas es normal.
- Completada: ya se hicieron. Se borran solas después de 30 días.
- Fallida: algo salió mal. No se borran solas.
- Cancelada: se anularon antes de ejecutarse.
Si ves miles de pendientes con fecha pasada, el problema no es la tabla: es que las tareas no se están ejecutando. Revisa la sección del cron real más abajo antes de limpiar.
Mira quién genera las tareas
Antes de borrar, averigua qué plugin produce el ruido. En phpMyAdmin, pestaña SQL (cambia wp_ si usas otro prefijo):
-- Cuántas acciones hay por estado
SELECT status, COUNT(*) AS total
FROM wp_actionscheduler_actions
GROUP BY status;
-- Qué tareas (hooks) se repiten más
SELECT hook, status, COUNT(*) AS total
FROM wp_actionscheduler_actions
GROUP BY hook, status
ORDER BY total DESC
LIMIT 15;
El nombre del hook casi siempre delata al plugin: woocommerce_…, wc-admin_…, mailpoet_…, rank_math_…. Si miles de fallidas vienen del mismo hook, abre una de ellas en el escritorio y lee el registro: ahí está el mensaje de error real, que suele ser una API externa caída o una clave vencida.
Limpiar con seguridad
Haz un respaldo de la base de datos primero. Luego borra por tandas: un solo DELETE sobre millones de filas puede bloquear la tabla y dejar la tienda sin poder procesar pedidos durante minutos.
-- Borrar acciones fallidas y canceladas de más de 30 días, de a 10.000
DELETE FROM wp_actionscheduler_actions
WHERE status IN ('failed', 'canceled')
AND scheduled_date_gmt < DATE_SUB(NOW(), INTERVAL 30 DAY)
LIMIT 10000;
-- Repite hasta que diga "0 filas afectadas". Luego, los registros huérfanos:
DELETE l FROM wp_actionscheduler_logs l
LEFT JOIN wp_actionscheduler_actions a ON a.action_id = l.action_id
WHERE a.action_id IS NULL;
No borres las pendientes si no sabes qué son. Algunas son renovaciones de suscripciones o correos que aún deben salir.
Si tienes SSH, después recupera el espacio en disco optimizando las tablas:
wp db query "OPTIMIZE TABLE wp_actionscheduler_actions, wp_actionscheduler_logs;"
Que no vuelva a pasar
Agrega este mu-plugin como wp-content/mu-plugins/cwp-action-scheduler.php. Hace que la limpieza automática también borre las fallidas y que guarde 14 días en lugar de 30:
<?php
/**
* Plugin Name: Action Scheduler a dieta (Curso WordPress)
*/
// Cuántos días guardar las acciones terminadas.
add_filter( 'action_scheduler_retention_period', function () {
return 14 * DAY_IN_SECONDS;
} );
// Qué estados se limpian automáticamente (por defecto no incluye las fallidas).
add_filter( 'action_scheduler_default_cleaner_statuses', function ( $estados ) {
$estados[] = 'failed';
return array_unique( $estados );
} );
Un cron de verdad para que nada se atasque
Por defecto, las tareas de WordPress solo se ejecutan cuando alguien visita el sitio. En una tienda con pocas visitas de madrugada, las tareas se amontonan; en una con mucho tráfico, se disparan de más. La solución profesional es un cron real del servidor.
- En
wp-config.phpagregadefine( 'DISABLE_WP_CRON', true );antes de «That’s all, stop editing». - En cPanel, abre Trabajos de cron y crea uno cada 5 minutos con este comando (ajusta el usuario y la ruta):
cd /home/usuario/public_html && /usr/local/bin/php wp-cron.php > /dev/null 2>&1
Si tienes WP-CLI en el servidor, esta versión es aún mejor porque también procesa la cola de Action Scheduler sin depender de las visitas:
cd /home/usuario/public_html && wp cron event run --due-now --quiet && wp action-scheduler run --batch-size=50 --quiet
No te olvides del paso 2. Si desactivas WP-Cron y no creas el cron del servidor, ninguna tarea programada se ejecutará: ni correos, ni entradas programadas, ni respaldos.
¿Tu tabla de acciones tiene más de un millón de filas? Comparte en el foro el resultado de la segunda consulta y te ayudamos a encontrar el plugin que la está llenando.





