WP-Cron en plugins: tareas programadas sin sorpresas en producción

Aprendes a programar tareas periódicas en tu plugin, evitar duplicados, controlar coste de ejecución y limpiar correctamente al desactivar.

Muchos plugins añaden tareas programadas sin control y terminan generando trabajo duplicado, lentitud o logs llenos de errores.

En esta lección construirás tareas periódicas para WP Avisos Contextuales con patrón seguro: programar una vez, ejecutar con guardas y limpiar al desactivar.

También verás cómo evitar que una tarea pesada se dispare en cascada y cómo registrar resultados para diagnóstico.

El objetivo es automatizar mantenimiento sin comprometer rendimiento ni estabilidad.

  • No es un daemon del sistema; depende de tráfico al sitio.
  • WP-Cron se ejecuta cuando hay peticiones y detecta eventos pendientes, por eso en sitios sin tráfico puede retrasarse.
  • En proyectos críticos, suele combinarse con cron del sistema que llame a `wp-cron.php` de forma controlada.
  • Entender esto evita expectativas falsas sobre precisión temporal.
  • WP-Cron: simple y portable.

Cómo funciona WP-Cron en realidad

No es un daemon del sistema; depende de tráfico al sitio.

WP-Cron se ejecuta cuando hay peticiones y detecta eventos pendientes, por eso en sitios sin tráfico puede retrasarse.

En proyectos críticos, suele combinarse con cron del sistema que llame a `wp-cron.php` de forma controlada.

Entender esto evita expectativas falsas sobre precisión temporal.

  • WP-Cron: simple y portable.
  • No garantiza puntualidad exacta.
  • Para alta criticidad, combinar con cron de servidor.

Programar eventos sin duplicarlos

Cada activación/reinicio no debe crear nuevas copias del mismo evento.

Antes de programar usa `wp_next_scheduled` para comprobar si ya existe la tarea.

Programa en activación o en bootstrap controlado, nunca en cada `init` sin condición.

Desprograma en `register_deactivation_hook` para evitar eventos huérfanos.

Diseña la tarea para no bloquear el sitio

Una tarea programada no debe comportarse como proceso infinito.

Divide trabajo en lotes (batch) y evita consultas masivas en una sola ejecución.

Si la tarea puede solaparse, usa lock transitorio para impedir doble ejecución simultánea.

Registra métricas básicas: duración, elementos procesados y errores para detectar degradación.

Caso real: cron duplicado tras varias activaciones

Sin chequeo previo, cada activación puede multiplicar tareas.

En un plugin de notificaciones, cada despliegue añadía un nuevo evento diario. Al mes había decenas de tareas idénticas ejecutándose.

El impacto fue aumento de CPU y logs duplicados. Se corrigió añadiendo `wp_next_scheduled` y limpieza estricta en desactivación.

Resultado: ejecución única y consumo estable.

WordPress Plugin
13

WP-Cron en plugins: tareas programadas sin sorpresas en producción

Aprendes a programar tareas periódicas en tu plugin, evitar duplicados, controlar coste de ejecución y limpiar correctamente al desactivar.

Código del tema: wp_schedule_event

📘 Teoría

Cómo funciona WP-Cron en realidad

No es un daemon del sistema; depende de tráfico al sitio.

WP-Cron se ejecuta cuando hay peticiones y detecta eventos pendientes, por eso en sitios sin tráfico puede retrasarse.

En proyectos críticos, suele combinarse con cron del sistema que llame a `wp-cron.php` de forma controlada.

Entender esto evita expectativas falsas sobre precisión temporal.

  • WP-Cron: simple y portable.
  • No garantiza puntualidad exacta.
  • Para alta criticidad, combinar con cron de servidor.

Programar eventos sin duplicarlos

Cada activación/reinicio no debe crear nuevas copias del mismo evento.

1

Antes de programar usa `wp_next_scheduled` para comprobar si ya existe la tarea.

2

Programa en activación o en bootstrap controlado, nunca en cada `init` sin condición.

3

Desprograma en `register_deactivation_hook` para evitar eventos huérfanos.

Alta y baja correcta de evento cron
register_activation_hook(WPAC_FILE, function (): void {
    if (!wp_next_scheduled('wpac_daily_maintenance')) {
        wp_schedule_event(time(), 'daily', 'wpac_daily_maintenance');
    }
});

register_deactivation_hook(WPAC_FILE, function (): void {
    wp_clear_scheduled_hook('wpac_daily_maintenance');
});

Diseña la tarea para no bloquear el sitio

Una tarea programada no debe comportarse como proceso infinito.

Divide trabajo en lotes (batch) y evita consultas masivas en una sola ejecución.

Si la tarea puede solaparse, usa lock transitorio para impedir doble ejecución simultánea.

Registra métricas básicas: duración, elementos procesados y errores para detectar degradación.

1

Antipatrón

Loop pesado sin límites ni locks.

  • Time-outs frecuentes.
  • Sobrecarga de base de datos.
  • Ejecuciones solapadas.
2

Patrón robusto

Lotes, lock y observabilidad.

  • Ejecución predecible.
  • Menos impacto en producción.
  • Fácil diagnóstico.

Caso real: cron duplicado tras varias activaciones

Sin chequeo previo, cada activación puede multiplicar tareas.

1

En un plugin de notificaciones, cada despliegue añadía un nuevo evento diario. Al mes había decenas de tareas idénticas ejecutándose.

2

El impacto fue aumento de CPU y logs duplicados. Se corrigió añadiendo `wp_next_scheduled` y limpieza estricta en desactivación.

3

Resultado: ejecución única y consumo estable.

🧪 Aprende probando

Ejemplo Ejemplo guiado: mantenimiento diario con lock Programamos tarea diaria que limpia caché y evita ejecuciones concurrentes.

🏁 Retos

Reto Reto real: añade ejecución por lotes Procesa máximo 100 eventos por ejecución para controlar consumo.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .