Erreur 503 sur WordPress
Le guide complet pour les administrateurs WordPress
Plugins, thèmes, mémoire, cron : identifiez et résolvez votre problème.
WordPress et les erreurs 503
WordPress alimente plus de 40% du web. Sa flexibilité (plugins, thèmes) est aussi sa faiblesse : chaque composant ajouté est une source potentielle de problème.
Les erreurs 503 sur WordPress ont des causes spécifiques qu’on ne retrouve pas sur d’autres plateformes. Ce guide couvre les scénarios les plus fréquents et leurs solutions.
Besoin d’une intervention immédiate ? WPHelp247 propose un support WordPress d’urgence disponible 24/7.
Les 7 causes principales sur WordPress
Plugins en conflit ou défaillants
Fréquence : ⭐⭐⭐⭐⭐ (très fréquent)
Un plugin mal codé, incompatible avec votre version de PHP ou WordPress, ou en conflit avec un autre plugin peut faire planter tout le site.
Symptômes :
- 503 apparue après installation/mise à jour d’un plugin
- Erreur
Fatal error: Class not founddans les logs - Le site plante sur certaines pages seulement
Limite mémoire PHP atteinte
Fréquence : ⭐⭐⭐⭐ (fréquent)
WordPress et ses plugins consomment de la RAM. Quand la limite est atteinte, PHP s’arrête brutalement.
Symptômes :
Fatal error: Allowed memory size exhausted- Page blanche ou 503 sur les pages lourdes (admin, Elementor)
- Le problème empire avec le temps
WP-Cron surchargé ou bloqué
Fréquence : ⭐⭐⭐ (courant)
Le système de tâches planifiées de WordPress peut s’emballer ou créer des files d’attente interminables.
Symptômes :
- Lenteur progressive puis 503
- Nombreuses requêtes vers
wp-cron.phpdans les logs - Actions programmées qui ne s’exécutent pas
Thème défaillant
Fréquence : ⭐⭐⭐ (courant)
Un thème avec du code problématique (boucle infinie, requêtes lourdes) peut faire tomber le site.
Symptômes :
- 503 après changement ou mise à jour de thème
- Le back-office fonctionne mais pas le front
- Erreurs dans
functions.phpou fichiers du thème
Base de données saturée ou corrompue
Fréquence : ⭐⭐ (moins fréquent)
Des tables MySQL volumineuses, des requêtes non optimisées ou une base corrompue peuvent provoquer des timeouts.
Symptômes :
Error establishing a database connectionintermittent- Lenteur extrême avant 503
- Problème après import ou migration
REST API ou AJAX surchargés
Fréquence : ⭐⭐ (moins fréquent)
Certains plugins (Gutenberg, page builders, Jetpack) font de nombreux appels REST API qui peuvent saturer le serveur.
Symptômes :
- Lenteur dans l’éditeur Gutenberg
- Beaucoup de requêtes
/wp-json/dans les logs - 503 principalement côté admin
Attaque brute force sur wp-login
Fréquence : ⭐⭐ (moins fréquent)
Des bots tentent des milliers de combinaisons login/password, saturant le serveur.
Symptômes :
- Énormément de requêtes vers
wp-login.phpouxmlrpc.php - IPs étrangères dans les logs
- Le problème disparaît si vous bloquez ces URLs
Problème 1 : Plugins en conflit
Diagnostic
Étape 1 : Identifier le plugin fautif via les logs
# Chercher les erreurs fatales PHP
$ grep -i "fatal" /var/log/php8.2-fpm.log | tail -20
# Exemple de résultat
PHP Fatal error: Class 'Starter_Sites\Starter_Plugin' not found in
/var/www/html/wp-content/plugins/starter-templates/starter-templates.php on line 12
# → Le plugin "starter-templates" est le coupable
Étape 2 : Vérifier les plugins récemment mis à jour
# Lister les fichiers modifiés récemment
$ find /var/www/html/wp-content/plugins -type f -mtime -1 -name "*.php" | head -20
Solutions
Solution A : Désactiver via WP-CLI (recommandé)
# Se placer dans le répertoire WordPress
$ cd /var/www/html
# Lister les plugins actifs
$ wp plugin list --status=active
+------------------------------+----------+--------+----------+
| name | status | update | version |
+------------------------------+----------+--------+----------+
| starter-templates | active | none | 3.1.2 |
| elementor | active | none | 3.18.0 |
| woocommerce | active | none | 8.3.0 |
+------------------------------+----------+--------+----------+
# Désactiver le plugin suspect
$ wp plugin deactivate starter-templates
Plugin 'starter-templates' deactivated.
# Le site remarche ? Oui → C'était ce plugin
# Non → Continuer l'investigation
Solution B : Désactiver tous les plugins d’un coup
# Désactiver tous les plugins
$ wp plugin deactivate --all
Plugin 'akismet' deactivated.
Plugin 'elementor' deactivated.
# ...
# Le site remarche ? Réactiver un par un
$ wp plugin activate akismet
$ wp plugin activate woocommerce
# ... jusqu'à retrouver le coupable
Solution C : Sans accès SSH (via FTP/SFTP)
Action via FTP
1. Connectez-vous en FTP à votre serveur
2. Naviguez vers /wp-content/plugins/
3. Renommez le dossier du plugin suspect :
starter-templates → starter-templates_disabled
4. Testez le site
5. Si ça fonctionne, le plugin était fautif
Solution D : Désactiver via base de données (dernier recours)
$ mysql -u wordpress -p wordpress_db
mysql> SELECT option_value FROM wp_options WHERE option_name = 'active_plugins';
# Copier la valeur quelque part (backup)
mysql> UPDATE wp_options SET option_value = 'a:0:{}' WHERE option_name = 'active_plugins';
# Tous les plugins sont maintenant désactivés
Plugins WordPress connus pour causer des 503
| Plugin | Problème fréquent | Solution |
|---|---|---|
| Elementor | Memory exhausted sur grosses pages | Augmenter memory_limit, optimiser les pages |
| WooCommerce | Timeout checkout, gros catalogues | Cache objet, optimiser BDD |
| Jetpack | Connexion WordPress.com timeout | Désactiver modules inutilisés |
| WPML | Requêtes BDD lourdes, conflits | Vérifier compatibilité, optimiser |
| Yoast SEO | Analyse SEO en temps réel lente | Désactiver l’analyse temps réel |
| WP Rocket | Cache corrompu | Vider le cache, désactiver temporairement |
| UpdraftPlus | Backup qui timeout | Planifier en heures creuses, exclure gros dossiers |
Problème 2 : Limite mémoire PHP
Diagnostic
# Voir la limite actuelle
$ wp eval "echo ini_get('memory_limit');"
128M
# Voir la consommation réelle
$ wp eval "echo round(memory_get_peak_usage()/1024/1024, 2) . ' MB';"
95.4 MB
# → 95 Mo utilisés sur 128 Mo disponibles, c'est serré
Dans les logs :
$ grep -i "memory" /var/log/php8.2-fpm.log | tail -10
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)
# 134217728 bytes = 128 Mo
Solutions
Méthode 1 : wp-config.php (recommandé)
wp-config.php
<?php
// Ajouter AVANT "That's all, stop editing!"
// Mémoire pour le front-end
define('WP_MEMORY_LIMIT', '256M');
// Mémoire pour l'admin (page builders, imports)
define('WP_MAX_MEMORY_LIMIT', '512M');
Méthode 2 : php.ini ou .user.ini
.user.ini (à la racine WordPress)
memory_limit = 256M
max_execution_time = 120
max_input_vars = 3000
Méthode 3 : .htaccess (Apache)
.htaccess
# Ajouter après "# END WordPress"
php_value memory_limit 256M
php_value max_execution_time 120
Augmenter la mémoire est un palliatif. Si un plugin consomme 500 Mo, il faut investiguer pourquoi. Utilisez le plugin « Query Monitor » pour identifier les consommations anormales.
Identifier le plugin gourmand en mémoire
mu-plugins/memory-debug.php
<?php
/**
* Plugin Must-Use : Log de consommation mémoire par plugin
* Désactiver après diagnostic !
*/
add_action('shutdown', function() {
if (!is_admin()) return;
$memory = round(memory_get_peak_usage() / 1024 / 1024, 2);
$url = $_SERVER['REQUEST_URI'];
error_log("[MEMORY] {$memory} MB - {$url}");
});
Problème 3 : WP-Cron surchargé
WordPress utilise un système de « pseudo-cron » déclenché par les visites. Problèmes courants :
- File d’attente de tâches qui s’accumule
- Plusieurs crons qui s’exécutent en parallèle
- Plugin qui planifie des tâches trop fréquentes
Diagnostic
# Voir les tâches cron en attente
$ wp cron event list
+-----------------------------------+---------------------+-----------------------+---------------+
| hook | next_run_gmt | next_run_relative | recurrence |
+-----------------------------------+---------------------+-----------------------+---------------+
| wp_scheduled_delete | 2024-12-26 15:00:00 | 23 minutes 12 seconds | daily |
| woocommerce_cleanup_sessions | 2024-12-26 14:37:00 | now | twicedaily |
| action_scheduler_run_queue | 2024-12-26 14:36:00 | 1 second ago | every minute | ← Suspect
+-----------------------------------+---------------------+-----------------------+---------------+
# Compter les requêtes wp-cron dans les logs
$ grep "wp-cron.php" /var/log/nginx/access.log | wc -l
15234 # ← Beaucoup trop en une journée
Solutions
Solution 1 : Désactiver WP-Cron natif et utiliser un vrai cron
wp-config.php
// Désactiver le cron déclenché par les visites
define('DISABLE_WP_CRON', true);
# Ajouter un vrai cron système (toutes les 5 minutes)
$ crontab -e
*/5 * * * * cd /var/www/html && /usr/bin/php wp-cron.php > /dev/null 2>&1
# Ou avec WP-CLI (plus fiable)
*/5 * * * * cd /var/www/html && /usr/local/bin/wp cron event run --due-now > /dev/null 2>&1
Solution 2 : Nettoyer les tâches en attente
# Supprimer les événements cron d'un plugin spécifique
$ wp cron event delete action_scheduler_run_queue
# Supprimer TOUS les événements cron (attention !)
$ wp cron event list --format=ids | xargs wp cron event delete
Solution 3 : Identifier le plugin qui abuse du cron
# Voir les hooks les plus fréquents
$ wp cron event list --fields=hook,recurrence | sort | uniq -c | sort -rn | head -10
45 action_scheduler_run_queue every minute
12 wp_update_plugins twicedaily
8 woocommerce_cleanup_sessions twicedaily
Si action_scheduler_run_queue apparaît des dizaines de fois, c’est un signe de file d’attente WooCommerce saturée :
# Voir la queue Action Scheduler
$ wp action-scheduler run
# Ou vider la queue si elle est bloquée
$ wp db query "DELETE FROM wp_actionscheduler_actions WHERE status = 'pending' AND scheduled_date_gmt < DATE_SUB(NOW(), INTERVAL 1 DAY);"
Problème 4 : Thème défaillant
Diagnostic
# Erreurs liées au thème dans les logs
$ grep -E "themes/(votre-theme)" /var/log/php8.2-fpm.log | tail -20
# Fichiers du thème modifiés récemment
$ find /var/www/html/wp-content/themes/votre-theme -type f -mtime -1
Solutions
Solution 1 : Revenir au thème par défaut
# Activer Twenty Twenty-Four
$ wp theme activate twentytwentyfour
# Le site fonctionne ? → Le thème était fautif
Solution 2 : Sans accès SSH
$ mysql -u wordpress -p wordpress_db
# Changer le thème actif
mysql> UPDATE wp_options SET option_value = 'twentytwentyfour' WHERE option_name = 'template';
mysql> UPDATE wp_options SET option_value = 'twentytwentyfour' WHERE option_name = 'stylesheet';
Solution 3 : Identifier le fichier problématique
Les fichiers les plus souvent en cause :
functions.php(code custom, hooks)header.php/footer.php(boucles, requêtes)- Fichiers du thème parent modifiés (thème enfant cassé)
Si vous utilisez un thème enfant, testez avec uniquement le thème parent actif pour isoler le problème.
Problème 5 : Base de données
Diagnostic
# Tester la connexion
$ wp db check
Success: Database checked.
# Taille des tables
$ wp db size --tables
+-----------------------+-------+
| Name | Size |
+-----------------------+-------+
| wp_options | 45 MB | ← Suspect si > 10 MB
| wp_postmeta | 120 MB|
| wp_posts | 35 MB |
| wp_actionscheduler_* | 250 MB| ← À nettoyer
+-----------------------+-------+
# Requêtes lentes
$ tail -50 /var/log/mysql/slow-query.log
Solutions
Solution 1 : Réparer et optimiser
# Réparer les tables corrompues
$ wp db repair
# Optimiser toutes les tables
$ wp db optimize
Solution 2 : Nettoyer wp_options (souvent surchargée)
# Voir les plus grosses entrées
$ wp db query "SELECT option_name, LENGTH(option_value) as size FROM wp_options ORDER BY size DESC LIMIT 20;"
# Supprimer les transients expirés
$ wp transient delete --expired --network
# Supprimer les transients d'un plugin spécifique
$ wp db query "DELETE FROM wp_options WHERE option_name LIKE '%transient%plugin_name%';"
Solution 3 : Nettoyer les révisions et données obsolètes
# Compter les révisions
$ wp post list --post_type=revision --format=count
4523
# Supprimer les révisions (garder les 5 dernières)
$ wp post delete $(wp post list --post_type=revision --format=ids) --force
# Limiter les révisions futures
# Dans wp-config.php :
# define('WP_POST_REVISIONS', 5);
Plugin recommandé : WP-Optimize pour un nettoyage régulier automatisé.
Problème 6 : REST API surchargée
Diagnostic
# Requêtes REST API dans les logs
$ grep "wp-json" /var/log/nginx/access.log | wc -l
8923 # En une journée
# Par endpoint
$ grep "wp-json" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -10
3421 /wp-json/wp/v2/posts
2134 /wp-json/wc/v3/products
1876 /wp-json/jetpack/v4/
Solutions
Solution 1 : Désactiver la REST API pour les non-connectés
functions.php ou mu-plugin
<?php
// Restreindre l'API REST aux utilisateurs connectés
add_filter('rest_authentication_errors', function($result) {
if (!is_user_logged_in()) {
return new WP_Error(
'rest_not_logged_in',
'API accessible uniquement aux utilisateurs connectés.',
['status' => 401]
);
}
return $result;
});
Solution 2 : Cache des réponses REST API
functions.php
<?php
// Ajouter des headers de cache aux réponses REST
add_filter('rest_post_dispatch', function($response, $server, $request) {
if (is_wp_error($response)) return $response;
$response->header('Cache-Control', 'public, max-age=300');
return $response;
}, 10, 3);
Solution 3 : Désactiver les endpoints inutiles
functions.php
<?php
// Supprimer les endpoints par défaut non utilisés
add_filter('rest_endpoints', function($endpoints) {
// Supprimer l'endpoint users (sécurité)
unset($endpoints['/wp/v2/users']);
unset($endpoints['/wp/v2/users/(?P<id>[\d]+)']);
return $endpoints;
});
Problème 7 : Attaque brute force
Diagnostic
# Requêtes vers wp-login.php
$ grep "wp-login.php" /var/log/nginx/access.log | wc -l
45231 # ← Clairement une attaque
# Top IPs attaquantes
$ grep "wp-login.php" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
12453 185.234.xx.xx
8921 91.134.xx.xx
5234 45.33.xx.xx
# Requêtes xmlrpc.php (souvent utilisé pour attaques)
$ grep "xmlrpc.php" /var/log/nginx/access.log | wc -l
23456
Solutions
Solution 1 : Bloquer xmlrpc.php (souvent inutile)
.htaccess
# Bloquer xmlrpc.php
<Files xmlrpc.php>
Require all denied
</Files>
Ou dans Nginx :
nginx.conf
location = /xmlrpc.php {
deny all;
return 444;
}
Solution 2 : Limiter les tentatives de connexion
functions.php ou plugin
<?php
// Rate limiting basique sur wp-login
add_action('wp_login_failed', function($username) {
$ip = $_SERVER['REMOTE_ADDR'];
$transient_key = 'login_attempts_' . md5($ip);
$attempts = (int) get_transient($transient_key);
if ($attempts >= 5) {
wp_die('Trop de tentatives. Réessayez dans 15 minutes.', 'Accès bloqué', ['response' => 429]);
}
set_transient($transient_key, $attempts + 1, 15 * MINUTE_IN_SECONDS);
});
Solution 3 : Changer l’URL de connexion
Plugin recommandé : WPS Hide Login (renomme wp-login.php)
Solution 4 : Protection Cloudflare
Règle WAF Cloudflare :
Si URI contient "wp-login.php" ET IP pas dans whitelist
→ Challenge CAPTCHA
Solution 5 : Bloquer les IPs au niveau serveur
# Bloquer une IP
$ iptables -A INPUT -s 185.234.xx.xx -j DROP
# Utiliser fail2ban
$ fail2ban-client status wordpress
Mode maintenance WordPress SEO-friendly
Le mode maintenance natif de WordPress ne gère pas le header Retry-After. Voici comment faire proprement :
Méthode recommandée : mu-plugin
wp-content/mu-plugins/maintenance-503.php
<?php
/**
* Mode maintenance avec 503 + Retry-After
*
* Activer : créer le fichier wp-content/.maintenance-503
* Contenu du fichier : nombre de secondes (ex: 3600)
*/
add_action('init', function() {
$flag = WP_CONTENT_DIR . '/.maintenance-503';
if (!file_exists($flag)) {
return;
}
// Laisser passer les admins
if (current_user_can('administrator')) {
return;
}
// Laisser passer WP-CLI
if (defined('WP_CLI') && WP_CLI) {
return;
}
// Lire la durée depuis le fichier
$retry_after = (int) trim(file_get_contents($flag)) ?: 3600;
// Envoyer les headers
http_response_code(503);
header('Retry-After: ' . $retry_after);
header('Cache-Control: no-store, no-cache, must-revalidate');
// Charger la page de maintenance
$maintenance_page = WP_CONTENT_DIR . '/maintenance.html';
if (file_exists($maintenance_page)) {
include $maintenance_page;
} else {
echo '<h1>Maintenance en cours</h1><p>Nous revenons bientôt.</p>';
}
exit;
}, 1);
Activation / Désactivation
# Activer (2 heures = 7200 secondes)
$ echo "7200" > /var/www/html/wp-content/.maintenance-503
# Vérifier
$ curl -I https://monsite.com
HTTP/1.1 503 Service Unavailable
Retry-After: 7200
# Désactiver
$ rm /var/www/html/wp-content/.maintenance-503
Commandes WP-CLI essentielles
# === DIAGNOSTIC ===
# Vérifier l'installation
$ wp core verify-checksums
# État de la base de données
$ wp db check
# Plugins avec problèmes de mise à jour
$ wp plugin list --update=available
# Taille de la base
$ wp db size --tables
# === RÉPARATION ===
# Réparer la BDD
$ wp db repair
# Vider tous les caches (transients)
$ wp transient delete --all
# Vider le cache objet
$ wp cache flush
# Régénérer les permaliens
$ wp rewrite flush
# === PLUGINS ===
# Désactiver tous les plugins
$ wp plugin deactivate --all
# Réactiver un par un
$ wp plugin activate woocommerce
# Désinstaller un plugin problématique
$ wp plugin uninstall plugin-name --deactivate
# === THÈMES ===
# Activer un thème par défaut
$ wp theme activate twentytwentyfour
# === UTILISATEURS ===
# Créer un admin d'urgence (si vous êtes bloqué)
$ wp user create urgence-admin [email protected] --role=administrator --user_pass=MotDePasseTemporaire
# === MISE À JOUR ===
# Mettre à jour WordPress (si rollback nécessaire)
$ wp core update --version=6.4.1 --force
Besoin d’une intervention rapide ?
Les experts WordPress de WPHelp247 interviennent en urgence, 24h/24, 7j/7.
Questions fréquentes
Comment accéder à l’admin si le site affiche une 503 ?
Plusieurs options : désactivez les plugins via FTP (renommez le dossier plugins), accédez via WP-CLI si disponible, ou modifiez la base de données pour désactiver les plugins (UPDATE wp_options SET option_value = 'a:0:{}' WHERE option_name = 'active_plugins';). Si vous avez configuré un mu-plugin de maintenance, assurez-vous que votre IP est exclue.
Le site plante uniquement quand je modifie une page avec Elementor, pourquoi ?
Elementor consomme beaucoup de mémoire, surtout sur les pages complexes. Augmentez WP_MEMORY_LIMIT à 512M minimum. Vérifiez aussi que les révisions ne sont pas infinies (limitez à 5) et que le serveur a assez de RAM. Si le problème persiste, désactivez les widgets Elementor non utilisés.
Après une mise à jour WordPress, j’ai une page blanche, que faire ?
Page blanche = erreur PHP fatale masquée. Activez le debug (WP_DEBUG = true) pour voir l’erreur. En général, c’est un plugin ou thème incompatible. Désactivez-les via FTP/WP-CLI, puis réactivez un par un. Si c’est le core, vous pouvez downgrader avec wp core update --version=X.X.X --force.
Mon hébergeur mutualisé limite PHP à 128 Mo, que faire ?
128 Mo est insuffisant pour WordPress + WooCommerce ou un page builder. Solutions : optimisez avec un plugin de cache (WP Rocket, LiteSpeed Cache), réduisez le nombre de plugins, ou changez d’hébergement pour un VPS où vous contrôlez les limites. En attendant, le fichier .user.ini peut parfois augmenter la limite sur certains hébergeurs.