Skip to Content
WordPressPartie 5 — Architecture du cœurWP-Cron : les tâches planifiées

Chapitre 5.8 — WP-Cron : les tâches planifiées

⏱️ TL;DRWP-Cron exécute des tâches périodiques (envoi d’e-mails, nettoyage, synchronisations, publication planifiée). Mais attention : ce n’est pas un vrai cron système — il est déclenché par le trafic (à chaque visite, WordPress vérifie s’il y a des tâches dues). Conséquence : un site sans visiteurs ne lance rien à l’heure, et un site très fréquenté le vérifie trop souvent. La bonne pratique en production : désactiver le WP-Cron déclenché par le trafic et le remplacer par un vrai cron système qui appelle wp-cron.php à intervalle régulier.

🎯 Objectifs

  • Comprendre le fonctionnement (et les limites) de WP-Cron.
  • Planifier un événement récurrent et unique.
  • Passer à un cron système fiable en production.
  • Éviter les pièges classiques (tâche jamais lancée, doublons).

1. Comment ça marche (et pourquoi c’est piégeux)

WP-Cron n’est pas un démon qui tourne en fond. À chaque chargement de page, WordPress regarde s’il existe des tâches planifiées dues et, le cas échéant, les exécute (dans une requête séparée non bloquante).

⚠️ Piège n°1 — pas de trafic, pas de cron. Une tâche « tous les jours à 3 h » ne partira pas à 3 h s’il n’y a aucune visite à ce moment : elle attendra le prochain visiteur. Pour une newsletter ou une synchro critique, c’est inacceptable → cron système (§4).

⚠️ Piège n°2 — trop de trafic, trop de vérifications. Sur un site très visité, la vérification à chaque page ajoute une surcharge. La solution est la même : désactiver le déclenchement par trafic et cadencer via cron système.


2. Planifier un événement récurrent

Trois étapes : choisir une récurrence, programmer l’événement (une fois), brancher un callback sur le hook.

// 1) Brancher la logique sur un hook custom add_action( 'monplugin_tache_quotidienne', 'monplugin_faire_le_menage' ); function monplugin_faire_le_menage() { // supprimer de vieux logs, envoyer un rapport, etc. } // 2) Programmer l'événement s'il ne l'est pas déjà (typiquement à l'activation du plugin) if ( ! wp_next_scheduled( 'monplugin_tache_quotidienne' ) ) { wp_schedule_event( time(), 'daily', 'monplugin_tache_quotidienne' ); }

Récurrences par défaut : hourly, twicedaily, daily, weekly. On peut en ajouter via le filtre cron_schedules.

⚠️ Piège n°3 — planifier à chaque chargement. Appeler wp_schedule_event() sans le garde wp_next_scheduled() replanifie la tâche à chaque page → doublons qui s’exécutent en boucle. Toujours vérifier avec wp_next_scheduled() d’abord, et planifier à l’activation (pas à chaque requête).


3. Événement unique & nettoyage

// Une seule fois, dans 10 minutes wp_schedule_single_event( time() + 600, 'monplugin_relance_paiement', array( $commande_id ) ); // Déprogrammer (ex. à la désactivation du plugin) $timestamp = wp_next_scheduled( 'monplugin_tache_quotidienne' ); if ( $timestamp ) { wp_unschedule_event( $timestamp, 'monplugin_tache_quotidienne' ); }

⚠️ Piège n°4 — ne pas nettoyer à la désactivation. À la désactivation du plugin (Partie 7), déprogrammez vos tâches (wp_clear_scheduled_hook()), sinon elles restent enregistrées et échouent (le callback n’existe plus).


4. La bonne pratique en production : cron système

On désactive le WP-Cron déclenché par le trafic, puis on l’appelle à intervalle régulier et garanti via le cron du serveur.

Dans wp-config.php :

define( 'DISABLE_WP_CRON', true ); // plus de déclenchement par les visites

Puis, dans la crontab du serveur (toutes les 5 minutes) :

*/5 * * * * cd /var/www/site && wp cron event run --due-now >/dev/null 2>&1 # (ou) */5 * * * * curl -s https://site.com/wp-cron.php?doing_wp_cron >/dev/null

On obtient un cron fiable (indépendant du trafic) et maîtrisé (fréquence choisie). C’est le standard sur les hébergements sérieux.

💡 Pour un dev React — WP-Cron « par défaut » est un cron opportuniste (déclenché par les requêtes), pas un scheduler garanti. Pensez à la différence entre « je vérifie mes tâches quand quelqu’un passe » et un vrai cron/queue (comme un worker Node, un cron Vercel, un BullMQ). En prod, on veut le second : DISABLE_WP_CRON + cron système = un ordonnanceur fiable. Pour des files d’attente lourdes, on utilise même des bibliothèques dédiées (Action Scheduler, utilisée par WooCommerce).


5. Déboguer le cron

  • wp cron event list (WP-CLI) : voir les tâches planifiées et leur prochaine échéance.
  • wp cron event run --due-now : forcer l’exécution des tâches dues.
  • Query Monitor et des plugins (« WP Crontrol ») listent et déclenchent les événements depuis l’admin.
  • Vérifier que la tâche n’est pas en double et que le callback est bien branché (add_action chargé au bootstrap, pas conditionnellement).

✏️ Exercices

  1. Pourquoi une tâche « chaque nuit à 3 h » peut-elle ne jamais s’exécuter à l’heure avec le WP-Cron par défaut ?
  2. Écrivez le code qui programme une tâche quotidienne sans créer de doublon.
  3. Comment rendre le cron fiable sur un site en production ?

✅ Solution

  1. Parce que WP-Cron est déclenché par le trafic : sans aucune visite à 3 h, la vérification n’a pas lieu ; la tâche attend le prochain visiteur. Un site peu fréquenté peut donc décaler fortement ses tâches.
add_action( 'monplugin_tache_quotidienne', 'monplugin_cb' ); if ( ! wp_next_scheduled( 'monplugin_tache_quotidienne' ) ) { wp_schedule_event( time(), 'daily', 'monplugin_tache_quotidienne' ); }

Le garde wp_next_scheduled() évite de replanifier (donc de dupliquer) à chaque chargement ; idéalement on planifie à l’activation du plugin. 3. Définir DISABLE_WP_CRON = true dans wp-config.php et appeler wp-cron.php (ou wp cron event run --due-now) via un cron système à intervalle régulier.


🧠 Quiz de révision

1. WP-Cron est-il un vrai cron système ?

Non : il est déclenché par le trafic (vérifié à chaque visite), pas par un démon garanti.

2. Comment planifier une tâche récurrente ?

wp_schedule_event( time(), 'daily', 'mon_hook' ) (avec garde wp_next_scheduled()), et add_action('mon_hook', callback).

3. Comment éviter les doublons de planification ?

Vérifier wp_next_scheduled() avant de planifier, et planifier à l’activation du plugin, pas à chaque requête.

4. Comment fiabiliser le cron en production ?

define('DISABLE_WP_CRON', true) + un cron système qui appelle wp-cron.php / wp cron event run régulièrement.

5. Que faire des tâches à la désactivation d’un plugin ?

Les déprogrammer (wp_clear_scheduled_hook()), pour ne pas laisser des événements sans callback.


Chapitre suivant : Rewrite API : les URLs propres.