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

WP-Cron
WP-Cron(wp-cron.php)
ⓐ Vérifie les tâches planifiées à chaque visite
ⓑ Tâches périodiques des extensions(Rank Math, WP Rocket etc.)
Problèmes de performances de WP-Cron
Dépendance au trafic
Surcharge du serveur due aux appels excessifs
Exécutions en double et goulots d'étranglement
Fonctionnement de WP-Cron
Planificateur virtuel basé sur le trafic
Déroulement des tâches planifiées
Exécution déclenchée par les visites, pas par l'horloge

Ⅱ. Optimiser les performances de WordPress

  • ↳ Optimiser via les réglages de WP-Cron

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.

WordPress
Optimisation des performances
Cache navigateur
Cache de page
Optimisation du front-end
Extensions associées(Autoptimize, ShortPixel, etc.)
Nettoyage de la base de données
Suppression des révisions/spam/tables temporaires
Extensions d'optimisation de la BD(WP-Optimize etc.)
Réglages de WP-Cron
WP-Cron(wp-cron.php)
ⓐ Vérifie les tâches planifiées à chaque visite
ⓑ Tâches périodiques des extensions(Rank Math, WP Rocket, etc.)
Problèmes de performances de WP-Cron
Dépendance au trafic
Surcharge du serveur due aux appels excessifs
Exécutions en double et goulots d'étranglement
Fonctionnement de WP-Cron
Planificateur virtuel basé sur le trafic
Déroulement des tâches planifiées
Exécution déclenchée par les visites, pas par l'horloge

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.

WP CLI- vérifier les événements cron planifiés avec la commande wp-cron event list_

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>&1

Les 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>&1

Si 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 --quiet

Avec 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 --quiet

Le 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 :

  1. 08:00 → le cron système appelle wp-cron.php
    • La tâche planifiée A s'exécute → verrou de 5 minutes posé
  2. 08:01 → le cron système appelle à nouveau
    • La tâche A est verrouillée → pas d'exécution
  3. 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.

Ⅲ. Quand les tâches planifiées de WP-Cron ne s'exécutent pas

On croit facilement qu'une tâche s'exécute d'elle-même à l'heure prévue, mais WP-Cron vérifie le travail à faire à l'arrivée d'une requête de page, pas à une heure donnée. Une tâche planifiée pour 14 h s'exécute à la première requête de 17 h si aucune n'arrive avant.

Quand l'exécution prend du retard, les articles planifiés s'affichent comme [Planification manquée](Missed schedule) dans la liste des articles. Dans [Améliorations recommandées] de l'onglet État de [Outils › Santé du site] apparaît [Un évènement planifié a échoué]. Les tâches enregistrées par les extensions, comme le préchargement du cache, attendent pour la même raison.

Les tâches planifiées s'exécutent dans [wp-cron.php] après une requête de page, la vérification du travail à faire et une requête de bouclage ; si l'un de ces maillons se rompt, elles ne s'exécutent pas, même une fois l'heure passée.

🧭 Le chemin d'une tâche planifiée jusqu'à son exécution
Schéma explicatif
🔍 Situation
🌐
Requête de page
Une visite qui exécute WordPress
✕ Ne s'exécute pas
→
🔎
Vérifier le travail à faire
Si une tâche a dépassé son heure
✕ Ne vérifie pas
→
🔁
Requête de bouclage
Serveur → sa propre adresse [wp-cron.php]
✕ 403
→
⚙️
Exécuter la tâche
[wp-cron.php] traite les tâches planifiées
✓ S'exécute
Quand arrive une requête qui exécute WordPress, les tâches en retard sont vérifiées et le serveur appelle [wp-cron.php] à sa propre adresse pour les traiter.
S'il n'y a pas de visites ou si la réponse vient d'un fichier de cache de page, WordPress ne s'exécute pas : les tâches en retard attendent la requête suivante.
Si [DISABLE_WP_CRON] vaut true, rien ne vérifie le travail à faire même quand des requêtes arrivent, et sans cron système, plus rien n'exécute les tâches.
Si une règle de sécurité bloque [wp-cron.php], la requête de bouclage revient en 403 et les tâches ne s'exécutent pas.

1️⃣ Quand il n'y a pas de visites ou que le cache de page répond

WP-Cron ne vérifie le travail à faire que lors des requêtes qui exécutent WordPress : aux heures sans visites, les tâches en retard s'accumulent. Même avec des visites, le résultat est le même si un fichier de cache de page répond, car WordPress ne s'exécute pas.

Sur un WordPress avec le cache de page de WP Rocket activé, l'ouverture de la page d'accueil mise en cache n'a enregistré aucun appel à [wp-cron.php]. En ouvrant une URL non mise en cache, un appel a été enregistré dans la même seconde et les cinq tâches en retard se sont exécutées.

Pour voir les tâches en retard, filtrez la liste WP-CLI sur les lignes dont [next_run_relative] vaut [now].

wp cron event list --next_run_relative=now --fields=hook,next_run_gmt,next_run_relative
+----------------------------------+---------------------+-------------------+
| hook                             | next_run_gmt        | next_run_relative |
+----------------------------------+---------------------+-------------------+
| rocket_saas_pending_jobs         | 2026-10-17 14:49:57 | now               |
| action_scheduler_run_queue       | 2026-10-17 14:49:57 | now               |
| action_scheduler_run_queue_rucss | 2026-10-17 14:49:58 | now               |
| rocket_saas_on_submit_jobs       | 2026-10-17 14:49:58 | now               |
| rocket_preload_process_pending   | 2026-10-17 14:49:59 | now               |
+----------------------------------+---------------------+-------------------+

[now] désigne une tâche dont l'heure prévue est déjà passée. Cette commande de liste charge elle aussi WordPress : s'il y a des tâches en retard, elle appelle [wp-cron.php] au moment où elle se termine. Relancez aussitôt la même commande, et les tâches que vous veniez de voir ont disparu de la liste.

Pour traiter les tâches en retard avant de corriger la cause, exécutez tout de suite avec WP-CLI uniquement celles qui sont échues.

wp cron event run --due-now
Executed the cron event 'rocket_saas_pending_jobs' in 0.005s.
Executed the cron event 'action_scheduler_run_queue' in 0.006s.
Executed the cron event 'action_scheduler_run_queue_rucss' in 0.006s.
Executed the cron event 'rocket_saas_on_submit_jobs' in 0.005s.
Executed the cron event 'rocket_preload_process_pending' in 0.007s.
Success: Executed a total of 5 cron events.

Cette commande exécute les tâches sur le serveur sans requête HTTP ; pour les traiter à intervalles fixes indépendamment des visites, enregistrez la même commande dans le cron système.

2️⃣ Quand seul DISABLE_WP_CRON est activé et qu'il n'y a pas de cron système

Avec [DISABLE_WP_CRON] à true, WP-Cron ne vérifie plus le travail à faire, même quand des requêtes de page arrivent. La documentation officielle indique elle aussi de s'inscrire d'abord au planificateur de tâches du système, puis d'ajouter cette constante ; ajouter la constante seule, sans inscription, ne laisse plus rien pour exécuter les tâches planifiées.

Avec la constante en place, un article planifié un peu plus d'une minute plus tard est resté [Planifié] une fois l'heure passée, et la colonne de date de la liste des articles affichait [Planification manquée]. Pendant ce temps, aucun appel à [wp-cron.php] n'a été enregistré.

Vous pouvez vérifier si la constante est active avec [wp cron test].

wp cron test
Error: The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled.

Si cette erreur apparaît, vérifiez si le cron système contient une ligne qui appelle [wp-cron.php] ou exécute [wp cron event run]. Si la crontab du compte du site est vide, voici ce qui s'affiche.

crontab -l
no crontab for example

S'il n'y a pas de ligne, enregistrez un cron système ; si votre environnement ne le permet pas, supprimez la ligne [DISABLE_WP_CRON] pour réutiliser WP-Cron.

3️⃣ Quand la requête de bouclage du serveur est bloquée

Quand il y a du travail, WP-Cron fait envoyer par le serveur une requête vers [wp-cron.php] à l'adresse de son propre site pour exécuter les tâches : c'est la requête de bouclage. Si une règle de sécurité bloque [wp-cron.php], la requête de bouclage revient en 403 et les tâches ne s'exécutent pas.

Sur un serveur en configuration Nginx + Apache, restreindre [wp-cron.php] pour qu'il ne s'ouvre que depuis 127.0.0.1 a bloqué la requête de bouclage en 403. En effet, la requête que le serveur envoie à son propre domaine arrive par l'IP publique, et [wp cron test] renvoie le même code d'état.

wp cron test
Error: WP-Cron spawn returned HTTP status code: 403 Forbidden

Avec des tâches en retard de plus de cinq minutes, l'écran [Santé du site] affichait ensemble, dans [Améliorations recommandées], l'avertissement de bouclage et l'évènement planifié en échec.

Onglet État de Santé du site affichant un évènement planifié en échec et un avertissement de requête de bouclage après le blocage en 403 de la requête de bouclage de WP-Cron

Une fois la règle supprimée, [wp cron test] a de nouveau réussi. Si vous devez garder la règle, exécutez les tâches avec WP-CLI depuis le cron système. Une exécution WP-CLI ne passe pas par une requête HTTP : les tâches en retard ont été traitées même avec la même règle en place.

🔢 FAQ & contenus recommandés

Les vérifications de mises à jour [wp_version_check], [wp_update_plugins] et [wp_update_themes] tournaient toutes les 12 heures sur le site de test. Le vidage de la corbeille ([wp_scheduled_delete]) et la suppression des transients expirés étaient enregistrés chaque jour, et la vérification Santé du site chaque semaine. Le vidage de la corbeille supprime définitivement les articles et commentaires restés plus de 30 jours (valeur par défaut) dans la corbeille ; si WP-Cron ne s'exécute pas, ces tâches ne s'exécutent pas non plus à l'heure prévue.

C'est le hook par lequel Action Scheduler, une bibliothèque de file de tâches intégrée aux extensions, traite les tâches en attente ; sur le site de test, il était enregistré toutes les minutes. La FAQ officielle d'Action Scheduler indique que cette file démarre par défaut depuis WP-Cron et à la fin des requêtes de l'administration (hook [shutdown]). Sur le site de test avec seulement [DISABLE_WP_CRON] activé et sans cron système, cette ligne est elle aussi restée à [now] avec l'article planifié.

D'après la documentation officielle, il existe une alternative : définir la constante [ALTERNATE_WP_CRON] à true dans [wp-config.php]. Quand des tâches sont à exécuter, la requête GET du visiteur est redirigée vers la même URL avec une valeur [doing_wp_cron]. [wp-cron.php] s'exécute alors dans la requête d'origine, sans passer par une requête de bouclage. La même documentation prévient que ce n'est pas le comportement par défaut de WordPress et que cela comporte des risques : si vous pouvez enregistrer un cron système, utilisez-le en priorité.

🧭 Contenus recommandés : tâches planifiées WordPress 7 articles · 4 références
🗂️ Tâches planifiées WordPress
📄 WP-Cron(wp-cron.php) 📄 Réglages de base de wp-config.php 📄 Santé du site WordPress
📋 Configurer crontab 📄 Commande nice sous Linux
📋 WP CLI : installation et configuration 📄 Trouver les compositions synchronisées : WP-CLI
📡 About Cron 📡 Événements WP Cron 📡 Comprendre la planification cron 📡 Relier WP-Cron au planificateur de tâches du système
Aucun résultat.

ℹ️ 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Prouvez que vous êtes humain : 4   +   6   =