WP-Cron en WordPress: cómo programar tareas fiables

WP-Cron es útil, pero no funciona como el cron del sistema. Aprende cuándo puede retrasarse, cómo diagnosticarlo y cuándo conviene usar un planificador externo para ejecutar tareas de WordPress de forma más predecible.

Portátil con código y entorno de trabajo digital para representar tareas programadas y automatización con WP-Cron en WordPress

WP-Cron permite que WordPress ejecute tareas programadas sin depender directamente del planificador del sistema operativo. Es cómodo, compatible con casi cualquier alojamiento y suficiente para muchos sitios. El problema aparece cuando se le exige la precisión de un cron real: WP-Cron no funciona como un servicio que permanece ejecutándose en segundo plano.

Entender esa diferencia ayuda a diagnosticar entradas programadas que llegan tarde, procesos que no se ejecutan cuando esperabas o automatizaciones que acumulan trabajo. La solución no siempre consiste en desactivar WP-Cron: primero hay que saber qué está fallando y qué nivel de puntualidad necesita realmente la tarea.

Qué es WP-Cron y cómo funciona

WordPress utiliza WP-Cron para gestionar acciones dependientes del tiempo. El sistema mantiene una lista de eventos pendientes y comprueba cuáles están preparados para ejecutarse cuando WordPress recibe actividad suficiente para lanzar el proceso.

La documentación oficial de WordPress explica que WP-Cron no se ejecuta continuamente como el cron del sistema. Si una tarea está prevista para una hora concreta y el sitio no recibe ninguna visita o petición que desencadene la comprobación hasta bastante después, la tarea puede ejecutarse con retraso.

Esto no significa que WP-Cron esté roto. Significa que su objetivo es ofrecer un planificador compatible con entornos donde el usuario no tiene acceso al cron del servidor.

Qué tareas pueden depender de WP-Cron

WordPress y sus plugins pueden utilizar el sistema de cron para trabajos como:

  • publicar entradas programadas;
  • ejecutar comprobaciones o mantenimientos periódicos;
  • procesar colas o acciones diferidas;
  • enviar avisos o resúmenes;
  • sincronizar información con servicios externos;
  • limpiar datos temporales;
  • ejecutar procesos creados por plugins de comercio, formularios, copias de seguridad o automatización.

La lista exacta depende de los plugins y del código del sitio. Por eso, antes de tocar la configuración, conviene identificar qué eventos existen y qué componente los ha registrado.

Por qué una tarea programada puede ejecutarse tarde

El sitio recibe poco tráfico

Es el caso clásico. Si nadie accede al sitio durante un periodo largo, WP-Cron puede no tener una oportunidad inmediata de procesar el evento pendiente. Para una tarea que solo necesita ejecutarse “aproximadamente cada hora” puede ser aceptable; para una integración que debe salir a las 08:00, quizá no.

Las peticiones loopback fallan

WordPress puede intentar iniciar wp-cron.php mediante una petición interna. Restricciones del servidor, autenticación HTTP, reglas de seguridad, problemas DNS o configuraciones de red pueden impedir ese flujo. En estos casos hay que diagnosticar la causa, no limitarse a aumentar timeouts.

Hay demasiadas tareas o alguna tarda demasiado

Un cron lleno de eventos repetidos o procesos pesados puede generar retrasos y picos de recursos. Una automatización robusta debería dividir trabajos grandes, controlar reintentos y evitar ejecutar varias veces la misma operación. Este criterio encaja con la guía sobre reintentos e idempotencia en automatizaciones.

WP-Cron está desactivado sin un disparador alternativo

Definir DISABLE_WP_CRON impide el disparo normal de WordPress. Si se hace eso y después no existe un cron del sistema, una tarea del hosting o un mecanismo equivalente que llame a wp-cron.php, los eventos pueden quedarse pendientes.

WP-Cron frente a cron del sistema

Aspecto WP-Cron Cron del sistema
Disparo Depende de actividad/peticiones de WordPress Lo inicia el planificador del servidor
Precisión temporal Aproximada Mucho más predecible
Acceso al servidor No suele ser necesario Normalmente sí
Configuración Integrada en WordPress Depende del hosting o sistema operativo
Uso recomendado Tareas no críticas y sitios sencillos Tareas sensibles al tiempo o infraestructuras con mayor control

No hay una opción universalmente mejor. WordPress señala que sustituir el disparo normal de WP-Cron por un planificador externo puede tener sentido, pero no es obligatorio si el sistema actual funciona correctamente y no existe una necesidad real.

Cuándo mantener WP-Cron tal como está

En muchos proyectos es preferible no añadir complejidad. Mantener WP-Cron puede ser suficiente cuando:

  • las tareas no necesitan ejecutarse al minuto exacto;
  • el sitio recibe tráfico con regularidad;
  • no existen retrasos observables;
  • las colas son pequeñas;
  • el hosting no ofrece un planificador externo;
  • el coste operativo de una configuración adicional no aporta una mejora tangible.

Optimizar no consiste en sustituir componentes que funcionan, sino en eliminar una limitación cuando esa limitación existe de verdad.

Cuándo tiene sentido usar un cron real

Un disparador del sistema puede ser una mejor opción cuando:

  • hay tareas que deben ejecutarse con una periodicidad predecible;
  • el sitio tiene poco tráfico y las tareas se retrasan;
  • se procesan sincronizaciones o colas de forma recurrente;
  • el alojamiento permite programar tareas cron de forma controlada;
  • quieres desacoplar el disparo de WP-Cron de las visitas del frontend.

El objetivo no es eliminar el sistema de eventos de WordPress. Lo habitual es mantener WP-Cron como gestor de las tareas y cambiar únicamente la forma de activarlo.

Cómo sustituir el disparador de WP-Cron de forma segura

1. Inspecciona los eventos existentes

Antes de modificar nada, identifica los hooks programados, su siguiente ejecución y su frecuencia. Con WP-CLI puedes listar los eventos:

wp cron event list

También puedes comprobar si el sistema de spawn funciona:

wp cron test

Estas comprobaciones ayudan a separar un problema de programación de un problema de ejecución.

2. Configura primero el disparador externo

En Linux o macOS, WordPress documenta el uso de crontab y una petición a wp-cron.php. Por ejemplo, una ejecución cada cinco minutos podría plantearse así:

*/5 * * * * wget --delete-after https://tu-dominio.com/wp-cron.php

La frecuencia debe elegirse según el tipo de tareas y la capacidad del servidor. Ejecutar el disparador cada minuto no mejora automáticamente una tarea que internamente está programada cada hora.

3. Comprueba que el cron externo funciona

Antes de desactivar el disparo normal, verifica que la petición se ejecuta y que los eventos pendientes avanzan. Si el hosting tiene un panel propio de tareas programadas, revisa sus logs o el estado de ejecución.

4. Desactiva el disparo automático de WordPress

Una vez confirmado el mecanismo externo, WordPress permite evitar que WP-Cron se lance con las visitas añadiendo en wp-config.php:

define( 'DISABLE_WP_CRON', true );

Este cambio debe hacerse solo cuando existe un sustituto probado. De lo contrario, puedes detener tareas que dependen del cron.

5. Valida las tareas importantes

Después del cambio, comprueba publicaciones programadas, emails, procesos de plugins, sincronizaciones y cualquier operación que dependa del tiempo. Igual que en un mantenimiento WordPress bien planteado, guardar una configuración no basta: hay que comprobar el resultado.

Cómo programar un evento sin duplicarlo

Si desarrollas una integración propia, uno de los errores más fáciles es llamar a wp_schedule_event() repetidamente. WordPress advierte que hacerlo puede crear múltiples eventos con el mismo hook.

La comprobación básica consiste en verificar primero si ya existe una próxima ejecución:

if ( ! wp_next_scheduled( 'gcn_sync_hook' ) ) {
    wp_schedule_event( time(), 'hourly', 'gcn_sync_hook' );
}

add_action( 'gcn_sync_hook', 'gcn_run_sync' );

function gcn_run_sync() {
    // Ejecutar aquí una tarea pequeña, controlada e idempotente.
}

Para integraciones con APIs o sistemas externos, además conviene registrar resultados, gestionar errores temporales y evitar duplicados. La guía de webhooks y APIs en WordPress amplía ese enfoque.

Elimina los eventos que ya no necesitas

Una tarea programada debería tener también un mecanismo de limpieza. Si un plugin propio se desactiva o una integración deja de existir, no conviene dejar hooks intentando ejecutarse indefinidamente.

WordPress proporciona funciones para localizar y desprogramar eventos. En un plugin, el proceso de desactivación puede limpiar el hook asociado para evitar residuos y ejecuciones innecesarias.

Cómo diagnosticar WP-Cron con WP-CLI

WP-CLI permite revisar el sistema sin instalar otro plugin solo para inspeccionar el cron:

# Comprobar el sistema de spawn
wp cron test

# Ver eventos registrados
wp cron event list

# Ejecutar ahora los eventos vencidos
wp cron event run --due-now

# Ver las frecuencias disponibles
wp cron schedule list

Ejecutar manualmente los eventos vencidos es útil para diagnóstico, pero no sustituye a corregir el motivo por el que dejaron de ejecutarse de forma normal.

Errores frecuentes al optimizar WP-Cron

  • Desactivarlo antes de crear el cron real. Deja tareas sin disparador.
  • Suponer que todos los retrasos son culpa de WP-Cron. Un callback lento o una API externa también pueden ser el cuello de botella.
  • Programar el mismo evento varias veces. Hay que comprobar si ya está registrado.
  • Crear intervalos demasiado agresivos. Más frecuencia puede significar más carga sin aportar utilidad.
  • Ejecutar trabajos enormes en una sola llamada. Es mejor dividir procesos y diseñarlos para reanudarse.
  • No limpiar hooks obsoletos. Las tareas que ya no existen siguen consumiendo recursos y complican el diagnóstico.
  • Instalar plugins solo para “arreglar el cron” sin analizar la causa. La herramienta debe responder a un problema concreto.

Checklist para una programación fiable

  • Identifica qué hooks dependen de WP-Cron.
  • Comprueba próxima ejecución y recurrencia.
  • Revisa si el sitio necesita precisión real o solo periodicidad aproximada.
  • Comprueba loopback y ejecución con WP-CLI cuando sea posible.
  • Evita eventos duplicados con wp_next_scheduled().
  • Haz que las tareas sean pequeñas e idempotentes.
  • Registra errores y resultados de procesos importantes.
  • Si usas cron del sistema, valida primero el disparador externo.
  • Solo después utiliza DISABLE_WP_CRON.
  • Vuelve a comprobar publicaciones, colas, emails e integraciones tras el cambio.

WP-Cron es una herramienta, no una garantía de puntualidad

WP-Cron resuelve bien una necesidad concreta: permitir que WordPress programe tareas en casi cualquier alojamiento. Para procesos no críticos puede ser exactamente lo que necesitas. Cuando la puntualidad, el volumen o la fiabilidad operativa tienen más peso, un cron del sistema puede convertirse en un disparador más predecible.

La decisión correcta parte de observar el comportamiento real del sitio y diseñar la automatización para soportar retrasos, reintentos y ejecuciones repetidas sin efectos secundarios. Si necesitas revisar procesos automáticos, integraciones o tareas programadas en un proyecto WordPress, puedes consultar el servicio de automatización e integraciones.

Fuentes y documentación

Foto del avatar
GonzaloCN
Artículos: 49

Deja un comentario

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