Las acciones programadas son una serie de mensajes en los que se describen acciones que realiza a cabo WooCommerce (y otros plugins) de manera programada, como la sincronización de productos, actualizaciones, etc. Estas acciones deben eliminarse una vez que se ejecutan, pero esto no siempre sucede.
Estas acciones programadas pueden estar en varios estados:
- Pendientes
- Completadas
- Fallidas
- Canceladas
Para visualizarlas e interactuar con estas acciones programadas puedes acceder a la pantalla de administración en el menú WooCommerce → Estado → Acciones programadas, si tienes activo WooCommerce, o en Herramientas → Scheduled Actions, en caso contrario.
Los mensajes y las mismas acciones programadas se almacenan en diversas tablas de la base de datos de tu WordPress:
wp_actionscheduler_actions
wp_actionscheduler_logs
wp_actionscheduler_claims
wp_actionscheduler_groups
El problema con las acciones programadas que se acumulan
Normalmente, los mensajes de acciones programadas deberían eliminarse cada 30 días, vaciándose en consecuencia sus respectivas tablas de la base de datos, pero no siempre es así…
Por distintos motivos, normalmente fallos en la sincronización de acciones programadas o con el cron de WordPress, en ocasiones no se eliminan las acciones programadas y sus mensajes, pudiendo llegar a acumularse miles, incluso millones, de MB en tu base de datos, normalmente en las tablas wp_actionscheduler_actions
y wp_actionscheduler_logs
.
Si quieres optimizar una web, parte importante de su rendimiento es la base de datos, y cientos de MB, incluso GB acumulados en tablas no ayudan, pero sobre todo no es normal, pues como te decía, esto suele ser un error, o sea, NO es normal una tabla de acciones programadas de varios gigas, por muy grande que sea la web o muchos plugins que tenga.
Nota importante: Siempre que realices cualquier modificación o acción importante para el rendimiento de tu web, como en el caso de todo lo que vamos a ver en este tutorial, debes antes de nada realizar una copia de seguridad completa de tu web, o como mínimo de la base de datos.
Nota: En este tutorial usamos como referencia de nombre de las tablas el prefijo por defecto (
wp_
) pero debes adaptar cualquier comando o función usando el prefijo que tú uses, no el prefijo por defecto. Por ejemplo, si me refiero a la tablawp_actionscheduler_actions
y tu prefijo de tablas de la base de datos espepito_
debes ejecutar la consulta o acción sobre la tablapepito_actionscheduler_actions
Cómo optimizar las tablas de acciones programadas
Antes de nada es importante que sepas que, por defecto, las tablas de WordPress se almacenan usando el motor InnoDB, que tiene una funcionalidad de bloqueo de nivel de fila, lo que significa que se pueden ejecutar varias consultas simultáneamente en la tabla.
Para webs de mucho tráfico o webs que sincronizan sus productos con otro sitio esto se convierte en un problema porque los registros no se pueden eliminar si se está ejecutando otra consulta y se mantienen para siempre.
Por lo tanto, como una solución simple, se puede configurar el motor de base de datos a MyISAM para la tabla wp_actionsscheduler_actions
para que solo se pueda ejecutar una consulta en la tabla, lo que significa que todas las demás acciones deben esperar a que finalice la primera.
Por supuesto, esto es más lento, pero definitivamente eliminará los registros de la tabla y evitará que aumente el tamaño en cientos de MB o incluso GB.
Cambiar el motor de base de datos de la tabla es, en realidad, sencillo:
- Selecciona la base de datos.
- Haz clic en el nombre de la tabla
wp_actionscheduler_actions
- Haz clic en la pestaña Operaciones
- Cambia el motor de la base de datos de InnoDB a MyISAM en la sección de Opciones de la tabla.
- Haz clic en Continuar.
Cómo borrar acciones programadas
La manera más obvia, y sencilla, de borrar acciones programadas es hacerlo desde su misma interfaz de administración. El problema es que, al menos en las de WooCommerce, solo puedes ir borrando de 10 en 10, lo que lo convierte en una tarea prácticamente inalcanzable en el caso de que tengas miles o cientos de miles de acciones acumuladas.
Si fuese viable solo tienes que ir a la pestaña de acciones programadas completas, canceladas o fallidas, seleccionar todas y, en el desplegable de acciones en lote, elegir la opción de borrar.
En las acciones programadas de WordPress es más sencillo, pues en las opciones de pantalla puedes mostrar más de 10 registros por página, y sería una opción más abarcable.
Cómo borrar acciones programadas masivamente
Como ya te habrás dado cuenta de que la opción manual no es viable en la mayoría de las ocasiones en las que realmente hace falta, cuando hay miles o millones de registros, tenemos que recurrir a otros métodos para realizar un borrado masivo del exceso de acciones programadas almacenadas en las tablas de la base de datos.
Vaciar el registro de acciones programadas
Una primera acción muy segura y sencilla que podemos realizar es vaciar la tabla del registro de acciones programadas, que también puede llegar a ocupar varios GB en casos extremos.
Para ello debes abrir la aplicación PHPMyAdmin desde el panel de tu empresa de hosting y, tras seleccionar la base de datos de tu instalación, marcar la tabla wp_actionscheduler_logs
y, abajo del todo de la lista de tablas, en el desplegable denominado Para los elementos que están marcados:, elegir la opción de Vaciar.
Este es un proceso sencillo, limpio y sin riesgos, que puede liberar montones de MB o incluso GB de tu base de datos sin provocar ningún efecto negativo en tu instalación.
Borrar acciones programadas mediante consultas SQL
En lo que se refiere a la tabla más problemática, wp_actionscheduler_actions
, la cosa no es tan sencilla, y no se puede (debe) vaciar como con la tabla de registros, pues eliminarías todas las acciones, incluso las pendientes, y esas son acciones que tienen que ejecutarse, no debes borrarlas.
Lo que queremos es deshacernos de esos montones de MB de acciones canceladas, fallidas o completadas, que no son necesarias para nuestra web y que suponen un problema de rendimiento.
Para ello podemos ejecutar consultas SQL que nos ayuden a eliminar aquellas acciones programadas que sobren, rápidamente. Puedes realizarlas mediante la interfaz de comandos (SSH) o desde la pestaña SQL de la herramienta PHPMyAdmin.
Borrar acciones programadas fallidas
DELETE FROM `wp_actionscheduler_actions` WHERE `status` = 'failed'
Borrar acciones programadas canceladas
DELETE FROM `wp_actionscheduler_actions` WHERE `status` = 'canceled'
Borrar acciones programadas completadas
DELETE FROM `wp_actionscheduler_actions` WHERE `status` = 'complete'
Borrar acciones programadas pendientes
Si, por algún motivo, también quieres borrar las que en estado pendiente (aunque no te lo recomiendo) con este comando:
DELETE FROM `wp_actionscheduler_actions` WHERE `status` = 'pending'
La ejecución de estos comandos borrará automáticamente y de una vez todas las acciones programadas elegidas (fallidas, canceladas, completadas), liberando cientos de MB o incluso GB de tu base de datos.
Cambiar el periodo de retención de las acciones programadas
Independientemente de la labor de limpieza de registros acumulados, es recomendable en instalaciones de webs con mucho tráfico y/o transacciones de venta, cambiar el periodo de retención de las acciones programadas, el rango de tiempo tras el que se eliminan automáticamente las completadas, fallidas y canceladas, que, por defecto, es de 30 días.
Para conseguirlo debes añadir una función a tu WordPress con el método que prefieras, como la siguiente:
/* Cambiar periodo retencion action scheduler */ function ayudawp_cambiar_retencion_action_scheduler() { return WEEK_IN_SECONDS; } add_filter( 'action_scheduler_retention_period', 'ayudawp_cambiar_retencion_action_scheduler' );
Con el ejemplo anterior cambiaremos el periodo de retención por defecto, de 30 días a 7 días (WEEK_IN_SECONDS
). Las posibilidades son las siguientes:
- MINUTE_IN_SECONDS
- HOUR_IN_SECONDS
- DAY_IN_SECONDS
- WEEK_IN_SECONDS
De este modo evitarás que la tabla wp_actionscheduler_actions
crezca de nuevo desmesuradamente.
¿Y esto no se puede hacer con plugins?
Que yo sepa, solo existe un plugin que permite realizar borrados sencillos y rápidos, y se llama Cleanup Action Scheduler. El cual lleva bastante tiempo sin actualizarse, y en las últimas versiones de WooCommerce no funciona, una pena, porque añadía unos iconos de papelera junto a cada estado de acción para poder borrarlas todas rápidamente.
Esperemos que se actualice y pronto podamos también tener esta sencilla opción de nuevo.