WP-Cron (wp-cron.php) : le désactiver et configurer un cron système | Optimisation des performances WordPress

Dans WordPress, les tâches Cron sont une fonction qui exécute automatiquement des tâches planifiées à une heure ou une date précise. Elles passent par le fichier wp-cron.php, que WordPress appelle à chaque chargement de page pour traiter les tâches planifiées. Cette méthode est simple, mais sur les sites à fort trafic elle peut dégrader les performances.
Ⅰ. Le fonctionnement de WP-Cron et ses problèmes de performances
Au lieu du système Cron traditionnel des serveurs Linux, WordPress propose sa propre fonction Cron, WP-Cron. WP-Cron passe par le fichier wp-cron.php : ⓐ à chaque visite du site, il vérifie s'il y a des tâches planifiées et les exécute, et ⓑ des extensions comme Rank Math et WP Rocket exécutent leurs propres tâches périodiques planifiées.
À l'inverse, sur les sites à fort trafic, wp-cron.php peut être appelé beaucoup trop souvent et surcharger le serveur. En particulier, quand plusieurs utilisateurs se connectent en même temps, des tâches cron en double s'exécutent, ce qui peut entraîner une hausse de l'utilisation du CPU, des réponses plus lentes, un chargement des pages plus lent et d'autres problèmes du même genre.
Ces limites structurelles de WP-Cron peuvent dégrader les performances de WordPress et, surtout sur les sites exigeants en performances, les boutiques en ligne et les portails d'actualité provoquer de graves goulots d'étranglement.
🔄 Fonctionnement et structure de WP-Cron

Ⅱ. Optimiser les performances de WordPress
Il existe de nombreuses façons d'optimiser les performances de WordPress. Après avoir optimisé le cache, le frontend et la base de données, on peut encore gagner grâce aux réglages de WP-Cron.
Les événements planifiés sont vérifiés à chaque chargement d'une page WordPress et, avec les tâches périodiques des extensions, il faut utiliser plus efficacement un WP-Cron peu efficace.
1️⃣ Tester WP-Cron
En vérifiant les tâches cron avec WP-CLI, on voit le Cron actif s'exécuter. On constate que des extensions comme Rank Math et WP Rocket exécutent leurs tâches planifiées chaque jour ou toutes les quelques minutes.

2️⃣ Configurer WP-Cron
WP-Cron est un planificateur virtuel qui gère les tâches planifiées de WordPress ; wp-cron.php s'exécute lors des visites. Mais l'exécution liée au trafic est instable et les appels excessifs peuvent charger le serveur : on le complète donc généralement par un cron système.
Au besoin, on recommande de définir DISABLE_WP_CRON dans wp-config.php pour désactiver WP-Cron, puis de l'exécuter régulièrement avec un cron Linux.
|
Catégorie |
Désactiver WP-Cron + exécuter uniquement le cron système |
|---|---|
|
Réglages |
Désactiver WP-Cron et exécuter wp-cron.php depuis le cron système |
|
Avantages |
Pas d'exécutions en double, exécution précise à heure fixe et faible charge serveur |
|
Inconvénients |
Certaines fonctions d'extensions peuvent s'arrêter, et une erreur de réglage risque de faire sauter des tâches |
|
Recommandé · Situation |
Adapté aux sites à fort trafic avec beaucoup de tâches planifiées |
La méthode ① a toutefois un inconvénient : elle désactive le préchargement (PreLoad) des extensions de cache comme WP Rocket, qui génère le cache chaque minute avant l'arrivée des visiteurs.
⚙️ Modifier le fichier wp-config.php
Vous pouvez le configurer en désactivant WP_CRON.
# Désactiver WP_CRON
define( 'DISABLE_WP_CRON', true );Pendant l'exécution de WP-Cron, WP_CRON_LOCK_TIMEOUT sert de « verrou temporel » qui bloque les autres tentatives d'exécution.
# 5 minutes = 300, toutes les 60 minutes = 3600
define('WP_CRON_LOCK_TIMEOUT', 300);Pour ces raisons, plutôt que de seulement désactiver WP-Cron dans le fichier wp-config.php, je recommande de le désactiver puis d'ajouter une tâche System Cron ; le serveur que je gère actuellement est d'ailleurs configuré ainsi.
⚙️ Activer un cron système sur un serveur Linux [base]
Vous pouvez l'activer par domaine.
# Exécuter toutes les 5 minutes
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Exécuter toutes les 30 minutes
*/30 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Exécuter toutes les heures
0 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Exécuter une fois par jour
0 3 * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1Les quatre lignes ci-dessus sont des exemples par intervalle à ajouter à la crontab : à chaque heure fixée, curl appelle l'adresse [wp-cron.php], si bien que les tâches planifiées s'exécutent même sans visiteurs.
# Si le serveur est un serveur local
*/5 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Exécuter toutes les 30 minutes
*/30 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Exécuter toutes les heures
0 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Exécuter une fois par jour
0 3 * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1Si WP-CLI est installé, vous pouvez ne définir qu'une ligne avec l'intervalle voulu. ▼
# Exécuter toutes les 5 minutes
*/5 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Exécuter toutes les 30 minutes
*/30 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Exécuter toutes les heures
0 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Exécuter une fois par jour
0 3 * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quietAvec ce réglage, WP-CLI exécute sur le serveur uniquement les tâches planifiées arrivées à échéance grâce à l'option [--due-now], et [flock -n] saute une nouvelle exécution tant que la précédente n'est pas terminée.
⚙️ WP-CLI et cron système toutes les minutes, et éviter les tâches cron en double
Par défaut, WP_CRON ignore (saute) simplement les tâches quand la charge est forte et les relance plus tard. Désactivez le WP-Cron par défaut et réglez les tâches planifiées pour conserver un verrou de 5 minutes, afin que le cron système et WP-Cron ne s'exécutent pas en même temps.
define('DISABLE_WP_CRON', true); // désactive l'exécution automatique de WP-Cron
define('WP_CRON_LOCK_TIMEOUT', 300); // pas d'attente → ignoré ; conserve un verrou de 5 minutes pendant l'exécution d'une tâche planifiée
/* That's all, stop editing! Happy publishing. */Ajoutez l'option flock -n au cron système pour que, côté cron système, l'exécution se termine immédiatement.
# Réglage wp cron : flock -n → pas d'attente → arrêt immédiat
*/1 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quietLe résultat de cette combinaison :
- L'exécution automatique interne de WP est désactivée → les tâches planifiées s'exécutent quel que soit le nombre de visiteurs
- Le cron système tente une exécution chaque minute → les tâches planifiées s'exécutent s'il y en a
- Une fois verrouillé, rien ne se relance pendant 5 minutes → évite les exécutions en double (en pratique, avec flock -n, WP_CRON_LOCK_TIMEOUT n'est pas vraiment nécessaire.)
Avec la prévention des doublons, le déroulement réel est le suivant :
- 08:00 → le cron système appelle wp-cron.php
- La tâche planifiée A s'exécute → verrou de 5 minutes posé
- 08:01 → le cron système appelle à nouveau
- La tâche A est verrouillée → pas d'exécution
- 08:02–08:04 → idem
- 08:05 → verrou levé → la tâche planifiée suivante s'exécute s'il y en a une
Au lieu que WordPress exécute les tâches automatiquement, c'est le système qui s'en charge. Et WP_CRON_LOCK_TIMEOUT sert de garde-fou supplémentaire contre les exécutions en double.
|
Catégorie |
WP_CRON_LOCK_TIMEOUT |
flock -n |
|---|---|---|
|
Type de verrou |
Interne à WordPress |
Niveau système |
|
Emplacement du verrou |
En base de données : doing_cron dans wp_options |
Fichier système : ~/.wp_cron.lock |
|
Attente ? |
❌ N'attend pas → saute |
❌ N'attend pas → s'arrête aussitôt |
|
Prévention des doublons |
✅ Évite les exécutions en double |
✅ Évite les exécutions en double |
Une fois terminé, vous pouvez vérifier avec une commande WP-CLI que le cron fonctionne toujours comme avant.
wp cron event list+-------------------------------------------+---------------------+-----------------------+---------------+
| hook | next_run_gmt | next_run_relative | recurrence |
+-------------------------------------------+---------------------+-----------------------+---------------+
| rocket_saas_pending_jobs | 2026-10-17 12:00:57 | now | 1 minute |
| action_scheduler_run_queue | 2026-10-17 12:00:57 | now | 1 minute |
| action_scheduler_run_queue_rucss | 2026-10-17 12:00:58 | now | 1 minute |
| rocket_saas_on_submit_jobs | 2026-10-17 12:00:58 | now | 1 minute |
| rocket_preload_process_pending | 2026-10-17 12:00:59 | now | 1 minute |
| rocket_purge_time_event | 2026-10-17 12:16:59 | 15 minutes 8 seconds | 1 hour |
| wp_privacy_delete_old_export_files | 2026-10-17 12:28:46 | 26 minutes 55 seconds | 1 hour |
| wp_update_user_counts | 2026-10-17 20:15:52 | 8 hours 14 minutes | 12 hours |
| rocket_preload_revert_old_failed_rows | 2026-10-17 20:17:59 | 8 hours 16 minutes | 12 hours |
| wp_version_check | 2026-10-17 20:28:34 | 8 hours 26 minutes | 12 hours |
| wp_update_plugins | 2026-10-17 20:58:34 | 8 hours 56 minutes | 12 hours |
| wp_update_themes | 2026-10-17 21:28:34 | 9 hours 26 minutes | 12 hours |
| recovery_mode_clean_expired_keys | 2026-10-18 07:28:46 | 19 hours 26 minutes | 1 day |
| wp_privacy_personal_data_cleanup_requests | 2026-10-18 07:28:46 | 19 hours 26 minutes | 1 day |
| wp_scheduled_delete | 2026-10-18 08:15:52 | 20 hours 14 minutes | 1 day |
| delete_expired_transients | 2026-10-18 08:15:52 | 20 hours 14 minutes | 1 day |
| wp_scheduled_auto_draft_delete | 2026-10-18 08:15:54 | 20 hours 14 minutes | 1 day |
| wp_delete_temp_updater_backups | 2026-10-18 08:16:17 | 20 hours 14 minutes | 1 week |
| rocket_update_dynamic_lists | 2026-10-18 08:16:57 | 20 hours 15 minutes | 1 week |
| rocket_saas_clean_rows_time_event | 2026-10-18 08:16:57 | 20 hours 15 minutes | 1 week |
| rocket_performance_hints_cleanup | 2026-10-18 08:16:58 | 20 hours 15 minutes | 1 day |
| rocket_preload_clean_rows_time_event | 2026-10-18 08:26:57 | 20 hours 25 minutes | 1 week |
| rocket_database_optimization_time_event | 2026-10-18 09:34:25 | 21 hours 32 minutes | 1 day |
| wp_site_health_scheduled_check | 2026-10-19 07:28:46 | 1 day 19 hours | 1 week |
| rocket_remove_saas_failed_jobs | 2026-10-19 08:16:58 | 1 day 20 hours | 3 days |
+-------------------------------------------+---------------------+-----------------------+---------------+La sortie affiche les noms des hooks enregistrés, l'heure de la prochaine exécution et la récurrence ; les tâches dont la colonne [next_run_relative] indique [now] sont traitées dès la prochaine exécution du cron.
ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.