Partager des instances wordpress sans activer le multisite

Partager des instances wordpress sans activer le multisite

Hébergé chez OVH, je cherchais à mettre en place plusieurs instances WordPress avec différents droits d’accès, mais pointant sur un même moteur pour simplifier les mises à jour. J’ai commencé par regarder du côté de la fonction multisite de WordPress 3 et je dois reconnaitre que j’ai eu un peu peur du côté usine à gaz de la chose en comparaison de la simplicité de ce que je voulais faire, en plus il fallait aller toucher au *.mon-domaine.com et je n’en avais pas trop envie.

Bilan, j’ai utilisé les outils à disposition (réduits au minimum chez OVH : du FTP et le manager qui permet de créer des sous-domaines) et des fonctionnalités historiques et simples de WordPress. Je dispose mainenant de 3 instances selon l’architecture suivante :

  • www.e-gaulue.com et e-gaulue.com qui correspondent à mon blog principal
  • family.e-gaulue.com qui correspond à un site à accès restreint sur la base d’une authentification HTTP au dessus d’un criptage SSL
  • test.e-gaulue.com que j’utilise pour mes tests de plugins…

Tous partagent un seul et unique moteur WordPress.

La création des sites secondaires

L’idée m’est venue en analysant le fonctionnement du fichier de configuration fourni par Debian, qui commence ainsi :

/* Look up a host-specific config file in
 * /etc/wordpress/config-<host>.php or /etc/wordpress/config-<domain>.php
 */
$debian_server = preg_replace('/:.*/', "", $_SERVER['HTTP_HOST']);
$debian_server = preg_replace("/[^a-zA-Z0-9.\-]/", "", $debian_server);
$debian_file = '/etc/wordpress/config-'.strtolower($debian_server).'.php';
/* Main site in case of multisite with subdomains */
$debian_main_server = preg_replace("/^[^.]*\./", "", $debian_server);
$debian_main_file = '/etc/wordpress/config-'.strtolower($debian_main_server).'.php';
 
if (file_exists($debian_file)) {
    require_once($debian_file);
    define('DEBIAN_FILE', $debian_file);
} elseif (file_exists($debian_main_file)) {
    require_once($debian_main_file);
    define('DEBIAN_FILE', $debian_main_file);
} elseif (file_exists("/etc/wordpress/config-default.php")) {
    require_once("/etc/wordpress/config-default.php");
    define('DEBIAN_FILE', "/etc/wordpress/config-default.php");
} else {
    header("HTTP/1.0 404 Not Found");
    echo "Neither <b>$debian_file</b> nor <b>$debian_main_file</b> could be found. <br/> 
Ensure one of them exists, is readable by the webserver and contains the right 
password/username.";
    exit(1);
}

Bien entendu, chez OVH, difficile d’aller dans /etc/wordpress. Aussi, en le modifiant légèrement, on obtient un fichier de configuration qui va chercher la bonne configuration en fonction de l’URL demandée.

/* Récupère le chemin du fichier courant où se trouve wp-config.php*/
if ( !defined('ABSPATH') )
	define('ABSPATH', dirname(__FILE__) . '/');
 
$debian_server = preg_replace('/:.*/', "", $_SERVER['HTTP_HOST']);
$debian_server = preg_replace("/[^a-zA-Z0-9.\-]/", "", $debian_server);
$debian_file = ABSPATH.'config-'.strtolower($debian_server).'.php';
 
if (file_exists($debian_file)) {
    require_once($debian_file);
} elseif (file_exists(ABSPATH."config-default.php")) {
    require_once(ABSPATH."config-default.php");
} else {
    header("HTTP/1.0 404 Not Found");
    echo "Neither <b>$debian_file</b> nor <b>$debian_main_file</b> could be found. <br/> 
Ensure one of them exists, is readable by the webserver and contains the right 
password/username.";
    exit(1);
}

Ensuite, tout repose sur la création de liens symboliques vers l’instance partagée et l’utilisation d’une fonctionnalité présente depuis le début de WordPress pour qu’il fonctionne dans un répertoire spécifique différent de DocumentRoot. La mise en oeuvre est décrite dans le Codex sous le nom « Giving WordPress Its Own Directory ».

Aussi, l’arborescence sur l’hebergement mutualisé d’OVH ressemble à ça :

|
+-wwwbase-+   <- Contient l'installation WordPress initiale (www.e-gaulue.com)
|      |
|      +-.htaccess                       <- Spécifique à cet instance
|      +-.httppassword                   <- Si besoin d'une authentification
|      +...                              <- Tout le reste des fichiers WordPress
|      +-wp-config.php                   <- Fichier de conf inspiré de celui de Debian
|      +-config-www.e-gaulue.com.php     <- Configuration de www.e-gaulue.com
|      +-config-family.e-gaulue.com.php  <- Configuration de family.e-gaulue.com
|      +-config-test.e-gaulue.com.php    <- Configuration de test.e-gaulue.com
|      +-config-e-gaulue.com.php -> config-www.e-gaulue.com.php
|
+-www1-+      <- Correspond au DocumentRoot du site family.e-gaulue.com
|      |
|      +-.htaccess                       <- Spécifique à cet instance
|      +-.httppassword                   <- Si besoin d'une authentification
|      +-wordpress -> ../wwwbase         <- Lien symbolique vers l'installation initiale
|
+-www2-+      <- Correspond au DocumentRoot du site test.e-gaulue.com
       |
       +...                              <- Idem à www1

Configurations diverses

Base de données

Comme je ne dispose que d'une base de données chez OVH, chaque instance de blog a son propre prefixe (paramétré dans le fichier de conf spécifique à chaque instance).

Configuration pour le partage des comptes "utilisateur" WordPress

Là encore, il s'agit d'une fonctionnalité intégrée de longue date à WordPress. Il suffit d'ajouter ces lignes au fichier de configuration des instances qui pointeront sur les tables d'utilisateurs "communes" :

//Attention ceci peut varier en fonction de vos prefixes
define('CUSTOM_USER_TABLE', 'wp_users'); 
define('CUSTOM_USER_META_TABLE', 'wp_usermeta');

On peut encore améliorer la configuration pour ne pas avoir à ressaisir d'identifiants quand on passe d'une instance de blog à une autre mais je n'ai pas mis en oeuvre les diverses propositions trouvées sur ce sujet. Dans mon cas, pour 2 à 3 sites, ce n'était pas primordial.

Configuration des fichiers htaccess

Personnelement, je n'aime pas avoir mes fichiers htaccess ouverts en écriture (un mode 404 est bien suffisant). Aussi, je n'utilise pas la faculté de WordPress d'y écrire directement ses règle de réécriture d'URL. Quand le fichier n'est accessible qu'en lecture, un accès à la page de configuration des permaliens de la plate-forme d'administration de WordPress vous indique les paramètres à ajouter au fichier htaccess. Généralement :

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^. /index.php [L]
</IfModule>

En plus de ces paramètres, j'y ai rajouté ceux-ci qui ne peuvent pas faire de mal :

# Pour utiliser PHP en version 5 chez OVH
SetEnv PHP_VER 5
 
# Pour accroitre la sécurité (je ne dis pas que c'est suffisant)
SetEnv REGISTER_GLOBALS 0
Options -Indexes

Dans le fichier htaccess du site protégé (family.e-gaulue.com), on trouve en plus de ce qui précède :

# Pour forcer le mode SSL 
SSLRequireSSL
ErrorDocument 403 https://family.e-gaulue.com
 
# Pour gérer l'authentification http
AuthUserFile /adresse_absolue_du_rep_www1_sur_le_serveur/.httppassword
AuthGroupFile /dev/null
AuthName "Entrer votre mot de passe"
AuthType Basic
Require valid-user

On trouve dans les guide OVH de la documentation sur la création du fichier httppassword chez OVH.

Configuration dans WordPress

La principale configuration dans WordPress concerne les variables siteurl et home dans la table options. Elles sont accessibles en SQL mais généralement les utilisateurs préfère utiliser la page "Réglages > Général" de la plate-forme d'administration de WordPress qu'on obtient en rajoutant /wp-admin à l'URL du blog. Cependant, quand on utilise WordPress dans un répertoire propre différent de DocumentRoot, il faut penser à pointer vers ce répertoire sans quoi votre serveur WEB ne peut pas deviner où se trouve le répertoire wp-admin. Dans le cas de l'instance family, c'est par exemple :
http://family.e-gaulue.com/wordpress/wp-admin.

Comme expliqué dans "Giving WordPress Its Own Directory", siteurl alias "Adresse web de WordPress" (dans la plate-forme d'admin) correspond à l'URL complète du site, soit http://family.e-gaulue.com/wordpress. home alias "Adresse web du site (URL)" correspond pour sa part à la page d'accueil, soit http://family.e-gaulue.com.

4 réactions au sujet de « Partager des instances wordpress sans activer le multisite »

    1. Merci. Tout ceci nécessitait surtout du temps, temps que je n’ai plus trop à l’heure actuelle pour poursuivre mes recherches et faire vivre ce blog !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *