09
nov.

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 :

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 :

/**
 * 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 :

/** 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{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');
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 :

// 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 :

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..php où 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 !