Trois méthodes permettent de passer WordPress en maintenance sans installer d’extension : déposer un fichier .maintenance à la racine, écrire une mu-extension d’une quinzaine de lignes, ou détourner les requêtes au niveau du serveur. La première prend dix secondes mais s’arrête d’elle-même ; la deuxième est le meilleur compromis ; la troisième est la seule qui tienne si PHP lui-même est en panne.

Méthode 1 — Le fichier .maintenance

WordPress possède son propre verrou, celui qu’il pose pendant ses mises à jour. Créez à la racine du site, à côté de wp-config.php, un fichier nommé .maintenance contenant une seule ligne :

<?php $upgrading = time(); ?>

Le site répond aussitôt en 503, avec un en-tête Retry-After: 600. Supprimez le fichier pour rouvrir.

Le piège, et il est de taille

WordPress ignore ce fichier au bout de dix minutes : il compare l’horodatage à l’heure courante et considère la maintenance terminée au-delà. Passé ce délai, votre site rouvre tout seul, au milieu de votre intervention. Cette méthode ne convient qu’aux opérations très courtes.

Deuxième limite : la page affichée est le message anglais du cœur, sans votre marque, et vous ne pouvez pas y accéder non plus — administrateur compris. Le guide de dépannage de ce message détaille son fonctionnement exact.

Méthode 2 — Une mu-extension de quinze lignes

C’est le bon compromis : le contrôle d’une extension, sans en installer une. Créez le dossier wp-content/mu-plugins/ s’il n’existe pas, puis un fichier maintenance.php à l’intérieur. Les mu-extensions se chargent automatiquement et n’apparaissent pas dans la liste des extensions désactivables.

<?php
/**
 * Plugin Name: Maintenance minimale
 */
add_action( 'template_redirect', function () {
	// Les administrateurs continuent de voir le vrai site.
	if ( current_user_can( 'manage_options' ) ) {
		return;
	}
	// robots.txt ne doit jamais recevoir un 5xx.
	$chemin = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
	if ( is_robots() || '/robots.txt' === $chemin || '/favicon.ico' === $chemin ) {
		return;
	}
	nocache_headers();
	header( 'Retry-After: 3600' );
	header( 'X-Robots-Tag: noindex, nofollow', true );
	wp_die(
		'Le site est en maintenance. Merci de revenir dans quelques instants.',
		'Maintenance',
		503
	);
}, 0 );

Trois détails font toute la différence avec les extraits qu’on trouve partout. La priorité 0 place le contrôle avant tout le reste. L’exclusion de robots.txt vérifie aussi le chemin de la requête, parce que is_robots() reste faux sur un site en permaliens simples. Et nocache_headers() empêche qu’un cache conserve la réponse d’erreur après la réouverture.

Pour rouvrir : supprimez le fichier. Rien d’autre à défaire, aucune option laissée en base.

Méthode 3 — Au niveau du serveur

Seule méthode qui fonctionne encore si PHP ou la base de données sont hors service — donc la seule valable pour une panne, par opposition à une intervention planifiée. Sur Apache, dans le .htaccess à la racine :

RewriteEngine On
RewriteCond %{REMOTE_ADDR}  !^203\.0\.113\.10$
RewriteCond %{REQUEST_URI}  !^/maintenance\.html$
RewriteCond %{REQUEST_URI}  !^/robots\.txt$
RewriteRule ^(.*)$ /maintenance.html [R=503,L]

ErrorDocument 503 /maintenance.html
Header always set Retry-After "3600"

Remplacez 203.0.113.10 par votre adresse IP publique : c’est elle qui vous laisse voir le site normal pendant que les autres voient la page temporaire. Sur nginx, l’équivalent tient en trois lignes dans le bloc server :

set $maintenance 1;
if ($remote_addr = 203.0.113.10) { set $maintenance 0; }
if ($request_uri = /robots.txt)  { set $maintenance 0; }
if ($maintenance = 1) { return 503; }
error_page 503 /maintenance.html;

Inconvénient : votre adresse IP change souvent, et une règle oubliée dans un fichier de configuration se retrouve six mois plus tard.

Laquelle choisir

MéthodePourLimite principale
.maintenanceUne opération de moins de dix minutesS’annule tout seul, et vous enferme dehors aussi
mu-extensionUne intervention planifiée, accès admin conservéNe survit pas à une panne de PHP
Règle serveurUne panne, une migration, un site hors serviceDépend de votre IP, et s’oublie

Le contrôle qui vaut pour les trois

curl -I https://votre-site.fr/
curl -I https://votre-site.fr/robots.txt

La première doit renvoyer 503 avec un Retry-After. La seconde ne doit pas renvoyer 5xx. Ce second point est celui que les trois méthodes ratent le plus facilement, et c’est aussi celui qui coûte le plus cher : un 5xx prolongé sur ce fichier fait cesser l’exploration du site entier.

Quand une extension redevient plus simple

Les trois méthodes ci-dessus supposent que vous soyez à l’aise avec un accès FTP ou SSH, et que vous pensiez à tout : l’accès administrateur, les chemins à exclure, les en-têtes anti-cache, la réouverture. Un banc d’essai des extensions du marché montre que ces oublis ne sont pas théoriques : deux extensions sur cinq laissent passer le défaut de robots.txt.

Mes503 Maintenance Page fait exactement ce que fait la mu-extension ci-dessus, avec une page présentable, un aperçu réservé aux administrateurs et un interrupteur. Si vous préférez le code, la mu-extension est un choix parfaitement défendable — c’est d’ailleurs de là qu’est parti ce plugin.