Ce que WordPress fait réellement pendant une mise à jour
Lors d'une mise à jour du noyau, d'une extension ou d'un thème, WordPress crée à la racine du site un fichier nommé .maintenance. Ce fichier contient une variable $upgrading, qui mémorise l'heure de sa création. Tant que ce fichier existe et qu'il a moins de 10 minutes, le site est en mode maintenance. Passé ce délai, le code source considère la maintenance comme terminée, même si le fichier est encore là. C'est une sécurité : une mise à jour interrompue ne bloque pas le site indéfiniment.
Dans sa version par défaut, WordPress envoie un en-tête Retry-After: 600 (10 minutes, exprimées en secondes) et affiche un message court qui invite à revenir dans une minute, avec le code de réponse 503. Le visiteur voit un écran sobre et le moteur de recherche reçoit le bon signal : indisponibilité temporaire.
Le piège du fichier maintenance.php
WordPress permet de remplacer ce message par un gabarit maison : il suffit de déposer un fichier maintenance.php dans le dossier wp-content. Le code source montre cependant un point que de nombreux tutoriels omettent : dans ce cas, WordPress charge le fichier puis arrête l'exécution, sans ajouter lui-même le code 503 ni l'en-tête Retry-After. Ils appartiennent au chemin par défaut uniquement. Votre gabarit doit donc les envoyer lui-même, par exemple avec http_response_code(503); et header('Retry-After: 3600'); placés avant tout affichage. Sans cela, la jolie page de marque répond en 200 : elle ressemble à une maintenance pour l'humain, mais pas pour le robot.