Como desactivar wp_cron y usar cron real con WP-CLI en WordPress

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

  1. Hacer copia de seguridad del fichero wp-config.php y, si procede, del sitio entero.
  2. Asegurarse de tener instalada y funcionando la herramienta WP-CLI en el servidor. Comprobar la versión con el comando wp –info.
  3. Determinar la ruta del ejecutable wp (por ejemplo, /usr/bin/wp o /usr/local/bin/wp) usando which wp o command -v wp.
  4. 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 --info

Si 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-now

Comandos ú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

  1. Verifica que DISABLE_WP_CRON está en wp-config.php y activo.
  2. 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
  3. Consulta la lista de eventos y su próximo disparo:
    wp cron event list --path=/var/www/html
  4. 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>1

Conclusió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 🙂



Deja una respuesta

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