Migrer un site marchand d’un hébergeur à un autre pose un problème que le mode maintenance classique ne résout pas : couper l’accès au site pendant plusieurs heures fait perdre des ventes, mais laisser les visiteurs passer commande ou publier un commentaire pendant la synchronisation finale des données crée un risque bien pire, celui de perdre ces contenus lors de la bascule.
La solution retenue sur la dernière migration que j’ai menée pour un client de vente d’instruments de musique : un mode « lecture seule » qui laisse le site entièrement consultable, mais bloque toute écriture en base de données, du commentaire à la commande WooCommerce.
Activer le mode via une constante
Une constante dans wp-config.php permet d’activer et de désactiver ce mode en une seule modification, déployable rapidement même sous pression le jour de la bascule :
define( 'SITE_LECTURE_SEULE', true );
Bloquer les commentaires
Le filtre preprocess_comment intercepte la soumission avant tout enregistrement en base :
add_filter( 'preprocess_comment', function ( $commentaire ) {
if ( defined( 'SITE_LECTURE_SEULE' ) && SITE_LECTURE_SEULE ) {
wp_die(
__( 'Le site est en maintenance technique, les commentaires sont temporairement désactivés.', 'mon-theme' ),
'',
[ 'response' => 503, 'back_link' => true ]
);
}
return $commentaire;
} );
Bloquer les commandes WooCommerce
Le hook le plus fiable pour intercepter une commande avant sa création reste woocommerce_checkout_process, qui permet d’ajouter une erreur bloquante avant validation, sans jamais laisser la commande atteindre la base :

add_action( 'woocommerce_checkout_process', function () {
if ( defined( 'SITE_LECTURE_SEULE' ) && SITE_LECTURE_SEULE ) {
wc_add_notice(
__( 'La boutique est en maintenance technique. Merci de repasser votre commande dans quelques heures.', 'mon-theme' ),
'error'
);
}
} );
Pour aller plus loin, masquer directement le bouton de commande sur la page panier évite au client d’arriver jusqu’au formulaire pour se voir bloqué à la dernière étape, ce qui est plus frustrant qu’un message affiché en amont :
add_filter( 'woocommerce_order_button_html', function ( $bouton ) {
if ( defined( 'SITE_LECTURE_SEULE' ) && SITE_LECTURE_SEULE ) {
return '<p>' . esc_html__( 'Commandes temporairement suspendues (maintenance).', 'mon-theme' ) . '</p>';
}
return $bouton;
} );
Bloquer les formulaires génériques (contact, inscription)
Selon les extensions utilisées pour les formulaires (Contact Form 7, Gravity Forms ou un formulaire maison), un filtre équivalent doit intercepter la soumission avant son traitement. Pour un formulaire maison utilisant admin-post.php, la vérification se fait en tout début du gestionnaire :
add_action( 'admin_post_nopriv_envoyer_contact', function () {
if ( defined( 'SITE_LECTURE_SEULE' ) && SITE_LECTURE_SEULE ) {
wp_die( __( 'Formulaire temporairement indisponible.', 'mon-theme' ) );
}
}, 5 );
Ce que ce mode laisse volontairement passer
- La navigation et la consultation des pages, articles et fiches produit restent entièrement fonctionnelles.
- Les connexions au compte client restent possibles, pour consulter l’historique de commandes.
- Les caches de pages continuent de servir du contenu statique, sans surcharge supplémentaire côté serveur pendant la migration.
Checklist du jour de bascule
- Activer
SITE_LECTURE_SEULEsur l’environnement source, au moins quinze minutes avant le début du transfert de base de données. - Vérifier manuellement qu’un commentaire test et une commande test sont bien bloqués avant de lancer l’export.
- Effectuer la synchronisation finale (base de données et fichiers médias récents).
- Basculer le DNS ou la configuration du répartiteur de charge vers le nouvel environnement.
- Désactiver la constante uniquement sur le nouvel environnement, jamais sur l’ancien qui sera bientôt éteint.
Le vrai risque d’une migration n’est presque jamais le transfert de fichiers, mais les quelques minutes où deux bases de données pourraient recevoir des écritures divergentes en parallèle.
En résumé
Ce mode lecture seule, propre à chaque projet dans ses détails mais toujours basé sur le même principe, protège l’intégrité des données pendant la fenêtre critique d’une migration, sans sacrifier l’expérience de consultation pour les visiteurs qui ne cherchent qu’à parcourir le site.