Voilà déjà plusieurs mois que je souhaite rédiger cet article à propos de l’environnement de travail pour le développement d’un site sous WordPress. Chaque développeur a ses habitudes propres à lui-même : l’idée ici n’est donc pas de dire que ma méthode est géniale et mieux que celles d’autres développeurs mais plutôt de présenter le départ d’une « industrialisation », afin d’avoir un code propre et générique pour débuter sans soucis le développement d’un site sous WordPress.

Étape 1 : Téléchargement des sources WordPress et installation

Nous allons commencer par télécharger les sources de WordPress. Habituellement, je les télécharge directement en français depuis le site https://fr.wordpress.org/. On se retrouve donc avec l’ensemble des dossiers et fichiers WordPress suivant :

dossiers-fichiers-wordpress

Après une installation classique en local, on se retrouve avec un fichier de configuration wp-config.php généré par WordPress.

Étape 2 : Définition des environnements

Créons maintenant à la racine de notre site un nouveau fichier php nommé wp-config.env.php. Ce fichier va servir à définir les différents environnements de développement. Voici son contenu :

<?php
/**
 * Setup environments
 */
// Set environment based on hostname
switch ($hostname) {
    case 'www.mon-site.dev':
        define('WP_ENV', 'development');
        break;
    case 'www.mon-site.recette':
        define('WP_ENV', 'testing');
        break;
    case 'www.mon-site.com':
        define('WP_ENV', 'production');
        break;
    default:
        die('Erreur de configuration de l\'environnement.');
        define('WP_ENV', 'production');
}

Comme vous le constatez ici, nous définissons simplement une constante PHP nommé WP_ENV  qui peut prendre potentiellement 3 valeurs (development, testing et production) en fonction d’un variable $hostname. Nous verrons plus tard, à l’étape 4 comment nous définissons cette variable.

Étape 3 : Créer un fichier de configuration par défaut : wp-config.default.php

Ce fichier va servir à définir toutes les constantes PHP utiles à WordPress et qui sont communes à tous les environnements de développement :

<?php
/** Jeu de caractères à utiliser par la base de données lors de la création des tables. */
define('DB_CHARSET', 'utf8');
/** Type de collation de la base de données.
 * N'y touchez que si vous savez ce que vous faites.
 */
define('DB_COLLATE', '');

/**#@+
 * Clefs uniques d'authentification et salage.
 *
 * Remplacez les valeurs par défaut par des phrases uniques !
 * Vous pouvez générer des phrases aléatoires en utilisant
 * {@link https://api.wordpress.org/secret-key/1.1/salt/ le service de clefs secrètes de WordPress.org}.
 * Vous pouvez modifier ces phrases à n'importe quel moment, afin d'invalider tous les cookies existants.
 * Cela forcera également tous les utilisateurs à se reconnecter.
 *
 * @since 2.6.0
 */
define('AUTH_KEY',         'g<k<Y3lbAxblA4TxeoIej9L@#$NO53,a-3+ZWH*?EOolWaQUP)HF3JBYf=[%dlqc');
define('SECURE_AUTH_KEY',  'BV<~<g#&nf|J]1D TCA#c+7Zf-KBy lGd@q:SvIdk>{uZW< d _~4IP8v2RpJqf?');
define('LOGGED_IN_KEY',    'Bs;:%aj#4uf4B0q-R$Fc]we f+8s%,[;5,h<[SuE7!+h|L}Okw2IxA*svz[k1U88');
define('NONCE_KEY',        'sf[#99}oo5GAfM9%yF{7*OGQJ%|guE}A+pdcd^TurwLuZq6>:4F>[e~a/aVyqqrD');
define('AUTH_SALT',        '}?U86?~Y_,M5eRLz&V:sQ9b`A}l8J!,LxY1>-*a!!4Z<pYN|q0ugtf6iNQ(4{pdk');
define('SECURE_AUTH_SALT', 'j1}H%D~?+C543Z0}YCP}^x[<`/`:8hY3-[`A=nn7UaA[q- OG_hu`|7C|R=%lz>');
define('LOGGED_IN_SALT',   '*Sunp$icPQMA+_ (.n`ox+8MII6(gV--x=D,lXkJ|J|f=D>veFsS8Y01k];F6Y5b');
define('NONCE_SALT',       '+}:;~BH-gQ$dYQ$&lyg-|*T84L[{`J6s9|Qie~eQc@/g+{N%Y+5,fcHlWXs97Q;0');

/**
 * Préfixe de base de données pour les tables de WordPress.
 *
 * Vous pouvez installer plusieurs WordPress sur une seule base de données
 * si vous leur donnez chacune un préfixe unique.
 * N'utilisez que des chiffres, des lettres non-accentuées, et des caractères soulignés!
 */
$table_prefix  = 'wp_';

/**
 * WordPress Localized Language, defaults to English.
 *
 * Change this to localize WordPress. A corresponding MO file for the chosen
 * language must be installed to wp-content/languages. For example, install
 * de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
 * language support.
 */
define('WPLANG', 'fr_FR');

/**
* Custom
*/
define('EMPTY_TRASH_DAYS', 30 );
define('DISALLOW_FILE_EDIT',true);
define('WP_POST_REVISIONS', false );

La plupart de ces lignes sont issues du fichier wp-config.php. Vous devez donc couper-coller ces lignes d’un fichier à l’autre. Ceci va donc considérablement alléger le fichier wp-config.php pour les constantes de clé uniques d’authentification et de sallage, je vous invite à utiliser le générateur fourni par WordPress.

Étape 4 : Modification et allègement  du fichier wp-config.php

Éditons maintenant le fichier wp-config.php pour l’alléger un peu. Voici son contenu complet :

<?php
// Try environment variable 'WP_ENV'
if (getenv('WP_ENV') !== false) {
// Filter non-alphabetical characters for security
    define('WP_ENV', preg_replace('/[^a-z]/', '', getenv('WP_ENV')));
}

// Define site host
if (isset($_SERVER['X_FORWARDED_HOST']) && !empty($_SERVER['X_FORWARDED_HOST'])) {
    $hostname = $_SERVER['X_FORWARDED_HOST'];
} else {
    $hostname = $_SERVER['HTTP_HOST'];
}

// Try server hostname
if (!defined('WP_ENV')) {
// Set environment based on hostname
    include 'wp-config.env.php';
}

// Are we in SSL mode?
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    $protocol = 'https://';
} else {
    $protocol = 'http://';
}

// Load default config
include 'wp-config.default.php';

// Load config file for current environment
include 'wp-config.' . WP_ENV . '.php';

// Define WordPress Site URLs if not already set in config files
if (!defined('WP_SITEURL')) {
    define('WP_SITEURL', $protocol . rtrim($hostname, '/'));
}
if (!defined('WP_HOME')) {
    define('WP_HOME', $protocol . rtrim($hostname, '/'));
}
// Clean up
unset($hostname, $protocol);

/* C'est tout, ne touchez pas à ce qui suit ! Bon blogging ! */
/** Chemin absolu vers le dossier de WordPress. */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

/** Réglage des variables de WordPress et de ses fichiers inclus. */
require_once(ABSPATH . 'wp-settings.php');

Voici les explications lignes par lignes :

  • Lignes 2 à 6 : Nous voyons donc qu’ici nous commençons à chercher si une variable d’environnement à été définie (via un fichier .htaccess par exemple).
  • Lignes 9 à 13 :Nous définissions ensuite la variable $hostname (utilisée à l’étape 2).
  • Lignes 15 à 19 : Ainsi, si aucune variable d’environnement n’a été définie, on la définie grâce à $hostname.
  • Lignes 21 à 26 : On stocke le protocole utilisé (http ou https ?)
  • Ligne 29 : On charge ensuite la configuration par défaut et commune à tous les environnements.
  • Ligne 32 : On charge après la configuration de l’environnement détecté
  • Lignes 34 à 42 : On définit WP_SITEURL et WP_HOME et on détruit les variables créées qui sont maintenant inutiles.
    • Lignes 44à 50 : Chargement de WordPress

Etape 5 : Création d’un fichier wp-config.development.php

Nous allons maintenant créer un fichier nommé wp-config.development.php qui va contenir tout ce qui concerne l’environnement de… développement tient! Voici ce qu’il contient :

<?php
define('DB_NAME', 'nom_bdd');
define('DB_USER', 'user_bdd');
define('DB_PASSWORD', 'pass_bdd');
define('DB_HOST', 'serveur_bdd');

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', true);
@ini_set('display_errors',1);

define('WP_SITEURL', 'http://www.mon-site.dev');
define('WP_HOME', 'http://www.mon-site.dev');
define('COOKIE_DOMAIN', 'mon-site.dev');

Ce fichier défini les constantes PHP permettant la connexion à la base de données. J’ai rajouté quelques constantes pour activer le debug de WordPress (car nous sommes dans l’environnement de développement) ainsi que la définition de WP_SITEURL et de WP_HOME.

Conclusion

Pour gérer une configuration wordpress sur d’autres environnements, vous n’avez qu’à créer un fichier nommé wp-config.<environnement>.php où <environnement> peut prendre les valeurs définies à l’étape 2 ! Cela peut paraitre un peu chronophage mais c’est vraiment très simple à mettre en place et tellement plus propre !