Guide de déploiement

Préproduction WordPress client : monter et tester avant la prod

Déployer sur un VPS Cloud →

Tutoriel

Préproduction WordPress client : monter et tester avant la prod

Déploiement12 min de lecture10 étapes

Une mise à jour de cœur ou d'extension se joue en quelques secondes et se paie parfois en heures, devant un client qui vend en ligne. Une préproduction mal isolée est pourtant pire que pas de préproduction : elle s'indexe, envoie de vrais e-mails aux clients du site ou écrase les URL de la production au retour. Ce guide monte pas à pas une copie sûre d'un site WordPress client, y teste les mises à jour une par une, lit les erreurs dans `debug.log`, puis reporte les changements sans écraser la base de production et avec un retour arrière prêt.

Sommaire· Pourquoi une préproduction plutôt qu'un test sur le site en ligne1/14
  1. 01Pourquoi une préproduction plutôt qu'un test sur le site en ligne
  2. 02Ce que la préproduction vous apporte
  3. 03Prérequis chiffrés avant de copier
  4. 04Monter la préproduction, étape par étape
  5. 05Isoler vraiment : le noindex ne suffit pas
  6. 06Neutraliser e-mails, paiements et tâches planifiées
  7. 07Liste de contrôle avant de toucher à la moindre extension
  8. 08Tester les mises à jour, une à la fois
  9. 09Quand la mise à jour casse : lire debug.log
  10. 10Dépannage : les autres symptômes qu'on rencontre vraiment
  11. 11Fichiers ou base : ce qui se reporte, et comment
  12. 12Reporter en production, et pouvoir revenir en arrière
  13. 13Le réflexe de durcissement
  14. 14Une routine qui tient à l'échelle d'un portefeuille

Pourquoi une préproduction plutôt qu'un test sur le site en ligne

Une extension de formulaire qui ne s'initialise plus, un thème qui perd sa mise en page, l'écran « Il y a eu une erreur critique sur ce site » : ces pannes arrivent après une mise à jour qui semblait anodine. Avec trois sites à gérer, la prudence suffit. Avec trente, on met à jour dans le noir ou on ne met plus à jour du tout, et c'est alors la faille non corrigée qui coûte.

Une préproduction est une copie vivante du site, sur une adresse distincte, avec sa propre base de données. On y casse ce qu'on veut, on lit les erreurs, on corrige, puis on rejoue sur la production le geste déjà validé. Elle ne remplace pas la sauvegarde : elle rend rarement nécessaire de s'en servir.

Ce que la préproduction vous apporte

  • Des mises à jour sans surprise — chaque changement de cœur, de thème ou d'extension est vu à l'écran avant d'atteindre les visiteurs.
  • Un diagnostic lisible — les erreurs vont dans un journal, pas devant le client, et la cause se retrouve avant qu'il appelle.
  • Une recette partagée — le client ou son chef de projet valide sur une adresse à part, sans toucher au site vitrine.
  • Un journal des changements — vous notez la version avant et après de chaque extension, et vous rejouez exactement la même sur la production.
  • Un essai des nouveautés — nouveau thème, nouveau constructeur de pages, nouveau module de paiement : tout se juge sur une copie.
  • Un retour arrière préparé — la sauvegarde est faite et vérifiée avant le test, pas après l'incident.

Prérequis chiffrés avant de copier

Comptez trois fois la taille du site en ligne en espace disque : le site, sa copie et l'export de la base. Relevez la taille de wp-content avec du -sh wp-content et celle de la base dans phpMyAdmin ou avec wp db size. Prévoyez un sous-domaine par client, par exemple staging.votre-domaine.com, et la même version de PHP que la production : une préproduction en PHP plus récent valide une configuration qui n'est pas celle du client. Cette version se lit dans Outils › Santé du site › Infos, et les versions encore prises en charge sont tenues à jour sur php.net/supported-versions.php.

Il faut aussi un terminal avec wp-cli (SSH sur un compte qui l'autorise, ou VPS). Ce guide décrit la copie manuelle, fichiers puis base, qui montre exactement ce qui est copié. Si WP Toolkit est disponible sur votre compte, son clonage produit cette copie à votre place (voir le guide « Installer WordPress depuis cPanel ») ; le reste du guide (noindex, authentification, e-mails coupés, tests) s'applique alors à l'identique. Pour l'installation d'un site neuf depuis cPanel, voir le guide dédié.

Monter la préproduction, étape par étape

  1. Sauvegarder la production avant toute écriture

    Depuis le dossier du site en ligne :
    mkdir -p ~/preprod-backups
    wp db export ~/preprod-backups/before-staging.sql --single-transaction
    tar -czf ~/preprod-backups/files-before-staging.tar.gz -C ~/public_html .
    Vérifiez que les deux fichiers existent et ne sont pas vides avec ls -lh ~/preprod-backups. Les sauvegardes de l'offre ne dispensent pas de ce geste : leur fréquence dépend de l'offre, donc elles peuvent dater de plusieurs jours.

  2. Créer le sous-domaine et son dossier

    Créez staging.votre-domaine.com dans cPanel (le guide « Créer un sous-domaine dans cPanel » détaille l'écran) avec un dossier racine propre, de préférence hors de public_html, par exemple ~/staging.votre-domaine.com. Un dossier placé dans public_html serait aussi atteignable par une adresse du site en ligne. Attendez que le certificat TLS du sous-domaine soit émis avant de tester.

  3. Copier les fichiers

    rsync -a --exclude='wp-content/cache/' ~/public_html/ ~/staging.votre-domaine.com/
    Adaptez le chemin source au dossier racine du site client. Sans terminal, le gestionnaire de fichiers de cPanel permet de compresser le dossier, de le déplacer puis de l'extraire dans le dossier du sous-domaine.

  4. Créer une base et un utilisateur dédiés

    Dans la section des bases de données MySQL de cPanel, créez une base neuve, un utilisateur et donnez-lui tous les droits sur cette base seule. Puis ouvrez le wp-config.php de la copie et changez DB_NAME, DB_USER et DB_PASSWORD. C'est l'erreur la plus coûteuse de ce guide : copier wp-config.php sans modifier ces trois lignes, c'est faire écrire la préproduction dans la base de production.

  5. Importer la base

    Depuis le dossier de la copie :
    cd ~/staging.votre-domaine.com
    wp db import ~/preprod-backups/before-staging.sql
    wp option get siteurl
    La dernière commande doit encore afficher l'adresse de production : c'est normal, les URL ne sont pas remplacées. Si elle échoue, wp-config.php pointe toujours vers la mauvaise base.

  6. Remplacer les URL, à blanc d'abord

    wp search-replace 'https://votre-domaine.com' 'https://staging.votre-domaine.com' --all-tables --skip-columns=guid --dry-run
    Lisez le rapport : il liste les tables et le nombre de remplacements. Puis relancez la même commande sans --dry-run. WordPress stocke beaucoup de réglages en données sérialisées, où chaque chaîne porte sa longueur : un sed sur l'export change la longueur de l'URL sans corriger ce compte, et les réglages deviennent illisibles. wp search-replace comprend ces données et les réécrit correctement.

  7. Poser les réglages de préproduction dans wp-config.php

    Ajoutez, au-dessus de la ligne « That's all, stop editing » :
    define('WP_ENVIRONMENT_TYPE', 'staging');
    define('DISABLE_WP_CRON', true);
    define('DISALLOW_FILE_EDIT', true);
    define('WP_DEBUG', true);
    define('WP_DEBUG_LOG', true);
    define('WP_DEBUG_DISPLAY', false);
    Les erreurs vont dans wp-content/debug.log sans s'afficher aux visiteurs. WP_ENVIRONMENT_TYPE existe depuis WordPress 5.5 et accepte local, development, staging et production : il permet aux thèmes et aux extensions de s'adapter, mais il ne masque pas le site aux moteurs, d'où l'étape suivante.

  8. Fermer l'accès et demander le noindex

    Dans Réglages › Lecture, cochez « Demander aux moteurs de recherche de ne pas indexer ce site », ou en ligne de commande : wp option update blog_public 0. Ajoutez ensuite une authentification HTTP au dossier de la copie : un fichier .htpasswd créé avec htpasswd -c ~/.htpasswd-staging client, puis dans le .htaccess du dossier les directives AuthType Basic, AuthName "Preproduction", AuthUserFile vers ce fichier et Require valid-user. À défaut, limitez l'accès à une liste d'IP.

  9. Contrôler la copie comme le ferait un robot

    curl -sI https://staging.votre-domaine.com/
    La réponse doit être un 401. Puis, avec les identifiants :
    curl -s -u client https://staging.votre-domaine.com/ | grep -i robots
    Vous devez voir une balise meta name='robots' contenant noindex. Si une extension de cache ou de référencement la remplace, c'est elle qu'il faut régler. Vérifiez enfin que le thème ne contient pas d'adresse de production en dur : grep -r "https://votre-domaine.com" wp-content/themes.

  10. Rattacher la préproduction à votre routine d'agence

    Faites de ce montage un modèle : un sous-domaine par client, dans le compte cPanel du client, avec la même liste de contrôle. L'ordre des opérations pour déplacer un site vers un autre hébergeur fait l'objet du guide « Migrer un site WordPress client sans coupure » ; la préproduction décrite ici est un outil durable, pas une étape de bascule.

Isoler vraiment : le noindex ne suffit pas

Le noindex demande aux moteurs de ne pas conserver une page, il n'empêche personne de la lire. Une préproduction accessible à tout le monde se retrouve dans un lien collé dans un ticket, dans un plan de site ou dans une capture d'écran, et elle diffuse alors un contenu en double de la production. Les deux protections se complètent donc : le noindex dit aux moteurs de ne pas indexer, l'authentification HTTP ou la liste d'IP interdit l'accès.

Un détail qui piège : si vous bloquez le sous-domaine par robots.txt, un robot ne lit plus la page et ne voit donc jamais la balise noindex. Avec l'authentification en place, ce fichier n'a plus d'utilité.

Neutraliser e-mails, paiements et tâches planifiées

La copie contient les vrais clients du site : abonnés, acheteurs, adresses de commande. Tout ce qui s'envoie tout seul doit être coupé avant le moindre test, sinon une relance de panier, un rappel de rendez-vous ou un renouvellement d'abonnement part en double depuis la copie. Les tâches planifiées de WordPress se déclenchent par les visites : en préproduction, désactivez-les avec DISABLE_WP_CRON et lancez-les à la main avec wp cron event run --due-now quand vous voulez les tester.

Liste de contrôle avant de toucher à la moindre extension

  • E-mails — extension d'envoi en mode test ou redirigée vers une boîte de recette, notifications de la boutique coupées.
  • Paiements — passerelle en mode test, clés de production retirées de la copie, adresses de rappel (webhooks) non déclarées pour la préproduction.
  • Tâches planifiées — DISABLE_WP_CRON posé, événements en attente relevés avec wp cron event list.
  • Modification de fichiers — DISALLOW_FILE_EDIT actif pour ne pas éditer le code depuis l'administration.
  • Journal d'erreurs — WP_DEBUG_LOG actif et WP_DEBUG_DISPLAY à false.
  • Intégrations tierces — CRM, annuaires, outils de statistiques et clés d'API de production remplacés ou retirés.
  • Moteurs de recherche — noindex posé et authentification en place, contrôlés avec curl comme ci-dessus.

Tester les mises à jour, une à la fois

Listez ce qui attend une mise à jour avec wp plugin list --update=available. Mettez ensuite à jour une extension à la fois : wp plugin update nom-extension, puis parcourez les pages qui comptent (accueil, formulaire de contact, panier, connexion) et lisez la fin du journal avec tail -n 30 wp-content/debug.log. Passez à la suivante seulement quand le journal est calme. Faites de même pour le thème avec wp theme update nom-theme, puis pour le cœur avec wp core update.

Notez dans un journal de changements, pour chaque ligne, la version avant et la version après. C'est cette liste que vous rejouerez sur la production, version par version, au lieu de copier quoi que ce soit.

Quand la mise à jour casse : lire debug.log

Le symptôme classique est l'écran « Il y a eu une erreur critique sur ce site ». WordPress passe alors en mode de récupération et envoie un lien à l'adresse d'administration, ce qui suppose que l'envoi d'e-mails fonctionne : en préproduction, il est neutralisé, donc inutile de l'attendre. La cause est dans le journal : tail -n 40 wp-content/debug.log. Cherchez la dernière ligne qui commence par PHP Fatal error, du type Call to undefined function ou Cannot declare class, et relevez le chemin du fichier : le dossier sous wp-content/plugins/ désigne l'extension fautive. Désactivez-la sans passer par l'administration avec wp plugin deactivate nom-extension, puis le site revient et vous savez qui accuser.

Dépannage : les autres symptômes qu'on rencontre vraiment

  • Le site redirige vers la production — wp option get siteurl et wp option get home affichent encore l'ancienne adresse, ou un constructeur de pages garde des URL en dur ; relancez le remplacement, avec --precise si besoin.
  • « Erreur lors de la connexion à la base de données » — DB_NAME, DB_USER, DB_PASSWORD ou DB_HOST de la copie sont faux, ou l'utilisateur n'a pas de droits sur la nouvelle base.
  • Images ou styles chargés depuis la production — des URL échappées, comme https:\/\/ dans les données JSON des constructeurs, ont échappé au remplacement ; relancez-le avec cette forme.
  • Boucle de connexion ou déconnexion immédiate — les cookies appartiennent à l'ancien domaine ; videz-les et vérifiez siteurl et home.
  • La préproduction apparaît dans un moteur de recherche — le noindex a été posé trop tard ou une extension le remplace ; passez à l'authentification HTTP et demandez la suppression de l'adresse.

Fichiers ou base : ce qui se reporte, et comment

Faites défiler le tableau

ÉlémentOù il vitComment le reporter en production
Thème et thème enfantFichiersDéployer le dossier validé, ou rejouer `wp theme update` à la version testée
ExtensionsFichiersRejouer `wp plugin update nom-extension --version=X` avec la version testée
Extensions obligatoires (mu-plugins)FichiersCopier le fichier validé, sauvegarde de l'ancien à côté
Médias envoyés (uploads)FichiersNe jamais pousser de la préproduction vers la production : la production reçoit de nouveaux médias
Réglages d'extensionBase (options)Refaire le réglage à la main sur la production, ou `wp option update`, en nommant l'option
Commandes, formulaires, comptes, commentairesBaseNe jamais écraser : ces données vivent côté production
Tables créées par une mise à jourBaseLaisser l'extension les créer en rejouant la mise à jour sur la production

Reporter en production, et pouvoir revenir en arrière

Sur un site transactionnel, n'importez jamais la base de la préproduction dans la production : pendant vos tests, des commandes, des inscriptions et des entrées de formulaire sont arrivées en ligne, et un import les efface. Rejouez plutôt les changements validés. Séquence : sauvegarde fraîche (wp db export et archive des fichiers, comme à l'étape 1), wp maintenance-mode activate, mises à jour dans l'ordre et aux versions du journal, contrôle des pages clés, puis wp maintenance-mode deactivate.

Pour revenir en arrière, restaurez d'abord les fichiers : wp plugin install nom-extension --version=ancienne --force ou l'archive de l'étape 1. Ne restaurez la base qu'en dernier recours, et seulement si la mise à jour a modifié des tables : tout ce qui est entré depuis la sauvegarde serait perdu, et l'export doit alors dater de quelques minutes. Gardez la sauvegarde jusqu'à ce que le client ait validé le site en ligne.

Le réflexe de durcissement

Quand la mise à jour est validée, supprimez la copie de la base de production laissée dans ~/preprod-backups et sur la préproduction : un export complet contient les adresses, les commandes et les hachages de mots de passe des clients. Ne laissez jamais WP_DEBUG actif sur le site en ligne, le journal peut y contenir des chemins et des requêtes.

Une routine qui tient à l'échelle d'un portefeuille

Une préproduction se juge à sa discipline : toujours le même montage, la même liste de contrôle, le même journal. Pour une agence, la routine tient dans un modèle de procédure : un sous-domaine par client, une base dédiée, noindex plus authentification, e-mails coupés, mises à jour une à la fois, report par rejeu. Elle s'applique d'autant mieux que chaque site client vit dans son propre compte, avec ses sauvegardes et ses accès séparés.

Une préproduction par client, sur une infrastructure isolée

Chaque site client gagne à vivre dans son propre compte cPanel : sous-domaine de préproduction, sauvegardes selon l'offre et accès séparés, le tout depuis une seule offre revendeur et un seul espace agence, avec votre marque. Côté client, vous gardez la main sur la relation ; l'infrastructure sous chaque site est la nôtre.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet