Sustitución de cronjobs de WordPress por tareas del sistema operativo

El sistema de automatización interno de WordPress (wp-cron) se activa con visitas y puede provocar ejecuciones irregulares, cargas innecesarias y problemas en sitios de tráfico bajo o alto. En este artículo explico, desde la perspectiva de un administrador de servidores y experto en hosting, cómo desactivar wp-cron y sustituirlo por tareas del sistema operativo (cron, systemd timers o programadores de Windows), con ejemplos prácticos, consideraciones de seguridad y monitorización.

Por qué sustituir wp-cron

wp-cron no es un demonio real: se ejecuta en cada carga de página cuando detecta tareas pendientes. Esto genera varios problemas:

  • Ejecuciones concurrentes y solapadas en picos de tráfico.
  • Tareas no periódicas en sitios con poco tráfico (no se ejecutan hasta la próxima visita).
  • Mayor latencia en páginas si se ejecutan tareas largas durante la solicitud.
  • Dificultad para depurar y monitorizar la ejecución de eventos programados.

La solución es delegar la ejecución a herramientas del sistema operativo, lo que mejora rendimiento, previsibilidad y control.

Pasos previos: desactivar wp-cron

Edite el archivo wp-config.php y añada la siguiente línea antes de la línea que dice ‘/* That’s all, stop editing! Happy blogging. */’:

define('DISABLE_WP_CRON', true);

Esto evita que WordPress intente ejecutar wp-cron.php en cada petición. No olvide desplegar este cambio en todos los entornos (staging, producción) y mantenerlo bajo control de versiones si corresponde.

Opción 1: crontab en Linux (método clásico)

En servidores Linux tradicionales, la forma más sencilla es crear una entrada en crontab. Existen dos enfoques: invocar wp-cron.php vía HTTP o usar WP-CLI para ejecutar eventos pendientes.

Invocar wp-cron.php por HTTP

Útil en entornos donde no está disponible WP-CLI. Ejemplo de crontab que ejecuta cada 15 minutos:

*/15 * * * * curl -sf 'https://tudominio.com/wp-cron.php?doing_wp_cron' >/dev/null 2>&1

Ventajas: simple. Inconvenientes: requiere que el servidor web responda correctamente y puede estar sujeto a cacheo o bloqueo por WAF/CDN.

Usando WP-CLI (recomendado)

WP-CLI ejecuta eventos en el entorno adecuado y evita dependencias HTTP. Ejemplo de crontab que ejecuta cada 5 minutos:

*/5 * * * * cd /var/www/html && /usr/bin/wp cron event run --due-now --path='/var/www/html' --quiet >/dev/null 2>&1

Asegúrese de que el binario wp está instalado y accesible, y de ejecutar la tarea con el usuario correcto (por ejemplo, el propietario de los archivos web) para evitar problemas de permisos.

Opción 2: systemd timers (en servidores modernos)

systemd timers reemplazan a cron en muchas distribuciones y ofrecen mayor control, logging y dependencias. Ejemplo de configuración:

/etc/systemd/system/wp-cron.service
[Unit]
Description=Run WP-Cron via WP-CLI

[Service]
Type=oneshot
User=www-data
WorkingDirectory=/var/www/html
ExecStart=/usr/bin/wp cron event run --due-now --path='/var/www/html' --quiet

---
/etc/systemd/system/wp-cron.timer
[Unit]
Description=Run WP Cron every 5 minutes

[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Persistent=true

[Install]
WantedBy=timers.target

Habilite y arranque el timer:

systemctl daemon-reload
systemctl enable --now wp-cron.timer
systemctl status wp-cron.timer

Ventajas: logs accesibles con journalctl, control granular y reinicio automático ante fallos.

Windows Server: Task Scheduler

En entornos Windows use el Programador de tareas para ejecutar un script PHP o WP-CLI. Ejemplo de acción:

  • Programa: C:\php\php.exe
  • Argumentos: -f C:\inetpub\wwwroot\wp-cron.php (o ejecutar wp cron event run --due-now si WP-CLI está instalado)
  • Frecuencia: cada 5 minutos

Asegúrese de que la cuenta que ejecuta la tarea tiene permisos adecuados.

Buenas prácticas operativas

  • Frecuencia: 5 minutos es habitual; para sitios con trabajo crítico o muchas tareas use 1–2 minutos solo si el servidor lo soporta.
  • Usuario correcto: ejecute las tareas con el usuario propietario de los archivos web (ej. www-data o apache) para evitar problemas de permisos y propietarios de transacciones.
  • Evitar solapamientos: si usa scripts largos, ajuste los tiempos o implemente locks (flock) para evitar ejecuciones concurrentes.
  • Seguridad: no exponga wp-cron.php públicamente si lo llama vía HTTP. Considere restringir acceso por IP o usar un token único. Si usa HTTP detrás de CDN, configure la regla para que la petición llegue al origen sin cacheo.
  • SELinux/AppArmor: tenga en cuenta políticas que puedan bloquear la ejecución. Revise logs del sistema si las tareas no se ejecutan.

Monitorización y logging

La predictibilidad mejora si monitoriza las ejecuciones:

  • Configure salida a archivo de log en los cron/systemd y rote los logs (logrotate).
  • Use alertas: un simple script que compruebe el timestamp de la última ejecución o un servicio de monitoring externo.
  • Revise errores de WP-CLI y PHP en los logs de sistema y de PHP-FPM.

Casos especiales y recomendaciones

Sitios en hosting compartido

Algunos hostings no permiten crear crons personalizados o carecen de WP-CLI. Si solo dispone de cron web, use la llamada HTTP con un token y frecuentes comprobaciones. Valore usar un servicio externo de cron (cron as a service) si el hosting impone limitaciones.

Sitios con contenedores o Kubernetes

En contenedores, evite ejecutar cron dentro del propio contenedor web. En Kubernetes, use CronJobs nativos para ejecutar WP-CLI contra el pod apropiado o use un job que llame al endpoint wp-cron interno.

Prevención de abuso

Si expone wp-cron.php por HTTP, bloquee bots y rates altos con reglas en el servidor o CDN. Configure encabezados y certificados correctamente para mantener comunicaciones seguras (vea documentación de PHP sobre ejecución CLI y de scripts).

Comprobación y mantenimiento

  • Después de implementar, fuerce una tarea cron manualmente para verificar: wp cron event run --due-now o curl al endpoint interno.
  • Revise la tabla de cron de WordPress (plugins, transients) si nota tareas pendientes que no se ejecutan.
  • Audite periódicamente la configuración: permisos, usuario, y actualizaciones de WP-CLI o PHP.

Recursos y enlaces útiles

Para profundizar en la ejecución de PHP en línea de comandos, consulte la documentación oficial de PHP. Si configura servidores web para aceptar o redirigir llamadas a wp-cron, la documentación de NGINX es de referencia para reglas y protección. Para buenas prácticas de seguridad en aplicaciones web, las guías de OWASP son imprescindibles.

Conclusión

Reemplazar wp-cron por tareas del sistema operativo es una mejora tangible en rendimiento, fiabilidad y capacidad de diagnóstico. La estrategia recomendada es desactivar wp-cron, usar WP-CLI en crontab o systemd timers, ejecutar las tareas con el usuario apropiado y añadir monitorización y logging. Estas medidas reducen latencia en peticiones, evitan ejecuciones inconsistentes y permiten un control profesional sobre los procesos automatizados de WordPress. Implementando los ejemplos mostrados y respetando las buenas prácticas de seguridad y permisos, obtendrá un sistema de tareas programadas robusto y escalable.