Chapitre 5.8 — WP-Cron : les tâches planifiées
⏱️ TL;DR — WP-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 gardewp_next_scheduled()replanifie la tâche à chaque page → doublons qui s’exécutent en boucle. Toujours vérifier avecwp_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 visitesPuis, 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/nullOn 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_actionchargé au bootstrap, pas conditionnellement).
✏️ Exercices
- Pourquoi une tâche « chaque nuit à 3 h » peut-elle ne jamais s’exécuter à l’heure avec le WP-Cron par défaut ?
- Écrivez le code qui programme une tâche quotidienne sans créer de doublon.
- Comment rendre le cron fiable sur un site en production ?
✅ Solution
- 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.