Contents
Introducción
Este artículo explica, paso a paso y con todo lujo de detalles, cómo desactivar el pseudo-cron interno de WordPress (wp_cron) y reemplazarlo por un cron real del sistema que ejecute las tareas programadas mediante WP-CLI. La razón para hacerlo suele ser obtener mayor fiabilidad y rendimiento en sitios con tráfico variable o cuando hay muchas tareas programadas.
Por qué desactivar wp_cron.php
- wp_cron se ejecuta cuando alguien visita el sitio en sitios sin tráfico puede no ejecutarse a tiempo, y en sitios con mucho tráfico puede dispararse en exceso y consumir recursos.
- Un cron del sistema ejecutado cada X minutos ofrece ejecución predecible y consistencia.
- WP-CLI permite ejecutar las tareas de WordPress desde la línea de comandos con mayor control y sin depender de peticiones HTTP.
Preparativos
- Hacer copia de seguridad del fichero wp-config.php y, si procede, del sitio entero.
- Asegurarse de tener instalada y funcionando la herramienta WP-CLI en el servidor. Comprobar la versión con el comando wp –info.
- Determinar la ruta del ejecutable wp (por ejemplo, /usr/bin/wp o /usr/local/bin/wp) usando which wp o command -v wp.
- Decidir el usuario con el que se ejecutará el cron (habitualmente el usuario del servidor web: www-data, apache, nginx, o el usuario propietario de los archivos de WordPress).
Paso 1 — Desactivar wp_cron en wp-config.php
Editar wp-config.php y añadir la constante DISABLE_WP_CRON antes de la línea que contiene / Thats all, stop editing /. Ejemplo:
Con esto evitamos que WordPress intente ejecutar tareas en cada visita.
Paso 2 — Verificar WP-CLI y rutas
Desde la terminal del servidor, comprobar la ubicación de WP-CLI y su información:
which wp wp --infoSi which wp devuelve una ruta, úsala en el cron. Si no, usa la ruta completa donde instalaste wp-cli o instala WP-CLI según la documentación oficial.
Paso 3 — Probar manualmente WP-CLI para gestionar cron
Antes de programar el cron, probar manualmente los comandos. Sitúate en la raíz de la instalación de WordPress o usa la opción --path:
cd /var/www/html wp cron event list wp cron event run --due-nowComandos útiles (resumen):
- wp cron event list — lista los eventos programados.
- wp cron event run --due-now — ejecuta todos los eventos que están pendientes.
- wp cron schedule list — muestra los intervalos (schedules) disponibles.
Paso 4 — Programar el trabajo en cron (ejemplos)
La idea es ejecutar periódicamente el comando WP-CLI que dispare las tareas pendientes. Normalmente se usa cada 5 minutos, pero la frecuencia depende de tus necesidades.
Opción A — Usando crontab del usuario web (recomendado)
Editar el crontab del usuario que gestiona los archivos (ej. www-data):
sudo crontab -u www-data -e
Agregar una línea como la siguiente (ajusta la ruta a tu instalación y la ruta a wp):
/5 cd /var/www/html /usr/bin/wp cron event run --due-now --path=/var/www/html > /dev/null 2>1
Explicación:
- /5 — cada 5 minutos.
- cd /var/www/html — aseguramos que WP-CLI se ejecute en la raíz del WordPress.
- /usr/bin/wp cron event run --due-now — ejecuta todos los eventos pendientes.
- > /dev/null 2>1 — suprime salida para depuración, redirige a un fichero de log en vez de /dev/null.
Opción B — Archivo en /etc/cron.d (útil para entornos con gestión por root)
Crear un archivo /etc/cron.d/wp-cron con contenido similar (aquí incluimos la especificación del usuario):
SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin MAILTO= # Ejecutar cron de WP cada 5 minutos como www-data /5 www-data cd /var/www/html /usr/bin/wp cron event run --due-now --path=/var/www/html > /var/log/wp-cron.log 2>1
Con esto se vuelcan errores y salidas en /var/log/wp-cron.log para revisión posterior.
Notas sobre el usuario y permisos
- nunca que ejecutes WP-CLI como root salvo que sepas por qué es preferible ejecutar como el usuario que posee los archivos (www-data, apache).
- si el binario wp no está en /usr/bin, usa la ruta correcta devuelta por which wp.
- en algunos casos es necesario exportar variables de entorno para WP-CLI (p. ej. WP_CLI_CACHE_DIR) o asegurar que el PATH incluye el PHP correcto.
Alternativa: usar curl/wget que invoque wp-cron.php
Si no puedes usar WP-CLI, la alternativa clásica es llamar a wp-cron.php vía HTTP o CLI PHP. Ejemplo con wget:
/5 wget -q -O - https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>1
O usando PHP CLI directamente:
/5 php /var/www/html/wp-cron.php > /dev/null 2>1
Sin embargo, usar WP-CLI es preferible porque ejecuta los hooks con el entorno WP cargado y con salida más controlada.
Comprobaciones y verificación
- Verifica que DISABLE_WP_CRON está en wp-config.php y activo.
- Ejecuta manualmente el comando que pusiste en cron para comprobar salidas y errores: desde la terminal, como el mismo usuario del cron:
sudo -u www-data -i cd /var/www/html /usr/bin/wp cron event run --due-now --path=/var/www/html
- Consulta la lista de eventos y su próximo disparo:
wp cron event list --path=/var/www/html
- Revisa logs del sistema si no ves actividad: /var/log/syslog o /var/log/cron o el fichero que hayas configurado (p. ej. /var/log/wp-cron.log).
Comandos WP-CLI más útiles para cron
- wp cron event list — ver eventos y cuándo se ejecutan.
- wp cron event run --due-now — ejecutar todos los eventos pendientes.
- wp cron event run hook_name — ejecutar un evento concreto (cuando conozcas su hook).
- wp cron schedule list — ver los intervalos registrados (hourly, twicedaily, etc.).
- wp cron event get event_id — obtener detalles de un evento.
Problemas comunes y cómo resolverlos
- El cron no se ejecuta: comprobar el crond está activo (systemctl status cron), comprobar el formato del crontab y que la línea esté registrada.
- WP-CLI da errores de permisos: ejecutar manualmente como el usuario elegido para ver mensajes ajustar permisos de archivos y directorios (propietario y group).
- Eventos no se ejecutan correctamente: ejecutar wp cron event run --due-now manualmente para observar errores y stack traces comprobar plugins que puedan bloquear o morir con errores.
- Problemas con el path de PHP: WP-CLI usa PHP del sistema si necesitas una versión concreta, asegúrate de que el PATH del cron apunte al php correcto o llama al binario PHP explícitamente antes de wp si usas un wrapper.
Buenas prácticas y recomendaciones
- Programar cron cada 5 minutos suele ser un buen compromiso entre latencia y carga. Para tareas muy críticas, reducir el intervalo para menos importantes, aumentarlo.
- Registrar la salida en un fichero de log y rotarlo con logrotate para diagnóstico. Ejemplo: redirigir a /var/log/wp-cron.log y añadir rotación.
- Evitar usar --allow-root en su lugar, ejecutar como el usuario propietario del sitio.
- Mantener WP-CLI actualizado y probar los comandos tras actualizaciones de WordPress o plugins que manipulen cron.
- Si administras múltiples sitios en la misma máquina, comprobar la carga y escalonar las ejecuciones para evitar picos simultáneos.
Ejemplo completo final
Resumen práctico que puedes adaptar a tu servidor:
# Crontab del usuario www-data (sudo crontab -u www-data -e) /5 cd /var/www/html /usr/bin/wp cron event run --due-now --path=/var/www/html >> /var/log/wp-cron.log 2>1Conclusión
Desactivar wp_cron y delegar la ejecución de tareas a un cron real con WP-CLI proporciona mayor fiabilidad y control sobre las tareas programadas en WordPress. Siguiendo los pasos anteriores —desactivar en wp-config.php, probar WP-CLI, programar el cron con el usuario adecuado y monitorizar logs— conseguirás un sistema más estable y predecible para la ejecución de eventos cron en WordPress.
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |