La fonctionnalité multisite de WordPress offre deux modes d'installation différents: sous-domaine et sous-répertoire install. Par défaut, les deux modes permettent de gérer des instances (sites) WordPress distinctes au sein d'une installation et d'un domaine principal. La différence évidente est le schéma d'URL pour tous les sites (dans l'exemple, multisite.tld
est le doman principal):
http://site1.multisite.tld
pour l'installation du sous-domaine ethttp://multisite.tld/site1
pour l'installation du sous-répertoire.Puisqu'il est possible de mapper n'importe quel domaine arbitraire sur des sites après leur création dans les deux modes, je me demande quelles sont les différences réelles entre les deux? De même, existe-t-il un moyen de changer de mode après l'installation?
Du point de vue de l'utilisateur, il y a deux différences notables. Tout d'abord l'interface graphique pour la création de nouveaux sites. Soit il affiche un champ de saisie pour le premier segment du chemin de l’URL (sous-répertoire) ou un champ de saisie pour le sous-domaine que vous souhaitez utiliser pour le nouveau site. (Définir l'URL sur une valeur complètement arbitraire n'est possible que lors de la modification d'un site déjà créé. Mais cela est possible dans les deux modes.)
L’autre n’est pas évident au premier abord et n’affecte que le mode sous-répertoire: la structure de liens permanents des sites principaux aura un préfixe statique blog/
qui ne doit pas être modifié. (Même s'il peut y avoir des solutions, changez ou supprimez le préfixe).
D'un point de vue technique, il s'agit d'une configuration système différente définie par les constantes de configuration, les valeurs de configuration dans la base de données et la configuration du serveur Web. Ce qui définit le mode en premier lieu, c’est la constante IS_SUBDOMAIN_INSTALL
qui peut être définie sur true
(mode sous-domaine) ou false
(mode sous-répertoire). Mais ce n'est pas le seul endroit où cette information est stockée. Pendant le processus d'installation, WordPress stocke une valeur entière sous forme de méta de site à l'aide de la clé subdomain_install
. Il peut être lu (ou mis à jour) via WP-CLI:
$ wp site option get subdomain_install
1
Le mode sous-répertoire génère un élément supplémentaire dans la liste des slugs de sites interdits: blog
. Ces listes sont stockées dans le méta site illegal_names
. Ainsi, en mode sous-répertoire, cela ressemble à ceci par défaut:
$ wp site option get illegal_names
array (
0 => 'www',
1 => 'web',
2 => 'root',
3 => 'admin',
4 => 'main',
5 => 'invite',
6 => 'administrator',
7 => 'files',
8 => 'blog',
)
Le serveur Web n'étant pas responsable des éléments internes de WordPress, sa configuration consiste essentiellement à acheminer l'URL demandée vers le script ou le fichier d'actif approprié. Il s'agit principalement de savoir si les URL de requête telles que /site-slug/wp-[admin|content|includes]
et /site-slug/wp-*.php
doivent être routées vers les répertoires appropriés (/wp-*/
) ou les scripts.
Donc, le jeu de règles de réécriture suggéré par défaut pour le mode sous-répertoire est le suivant:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
Alors que l’ensemble pour sous-domaine mode est suggéré comme ceci:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
Le type de jeu de règles utilisé dépend fortement du schéma de domaine souhaité que vous planifiez pour votre site multisite. Le plus flexible est bien sûr le premier (sous-répertoire) car le segment de chemin d’URL ("sous-répertoire") est totalement facultatif}.
is_subdomain_install()
Pour savoir quel mode est configuré, WordPress fournit la fonction is_subdomain_install()
, qui renvoie true
si:
SUBDOMAIN_INSTALL
est définie et définie sur true
ou SUBDOMAIN_INSTALL
n'est pas définie mais VHOST
est définie et définie à 'yes'
Il renvoie false
si SUBDOMAIN_INSTALL
est défini et défini sur false
. Et il renvoie n'importe quoi d'autre si SUBDOMAIN_INSTALL
est défini mais pas de type boolean. La méta valeur du site mentionnée ci-dessus n'est utilisée que pendant le processus de configuration de plusieurs sites. Le noyau WordPress ne repose que sur la valeur de cette constante partout ailleurs.
Cependant, la valeur de is_subdomain_install()
affecte le routage de l'URL demandée vers un site spécifique du réseau uniquement si les constantes DOMAIN_CURRENT_SITE
et PATH_CURRENT_SITE
ne sont pas définies. (Voir ms_load_current_site_and_network()
). Cela signifie qu'il est possible d'utiliser n'importe quel domaine en tant qu'URL de site dans les deux modes (mappage de domaine).
IS_SUBDOMAIN_INSTALL
de true
à false
Définissez la valeur de la méta de site subdomain_install
sur 0
:
$wp site option set subdomain_install 0
/blog/
à la structure de lien permanent du site principal. Il sera corrigé après la mise à jour du paramètre.blog
à la liste des slugs de sites interdits. Comme cette liste est une valeur sérialisée, vous devez le faire via un petit script PHP pouvant être exécuté via WP-CLI:$ wp eval-file patch-forbidden-slugs.php
// patch-forbidden-slugs.php
<?php
$illegalNames = get_metadata( 'site', SITE_ID_CURRENT_SITE, 'illegal_names', true );
$blogSlug = 'blog';
if ( in_array( $blogSlug, $illegalNames ) ) {
exit( 'Noting to do' . PHP_EOL );
}
$illegalNames[] = $blogSlug;
update_metadata( 'site', SITE_ID_CURRENT_SITE, 'illegal_names', $illegalNames );
exit( 'Done' . PHP_EOL );
IS_SUBDOMAIN_INSTALL
de false
à true
Définissez la valeur de la méta de site subdomain_install
sur 1
:
$ wp site option set subdomain_install 1
Supprimez le préfixe /blog/
de la structure de lien permanent du site principal
blog
de la liste des noms interdits (adaptez le script ci-dessus en conséquence)Mes remarques ne prennent en compte qu'une installation propre de WordPress et une installation réseau immédiate. La dernière version de WordPress 4.8 est également prise en compte. Il est possible qu’il y ait des implications lors d’une installation multisite sur un système existant utilisant des plugins ou toute version antérieure de WordPress.
Cependant, ma configuration préférée est le mode sous-domaine avec l'ensemble de règles .htaccess pour les sous-répertoires, car il offre une grande souplesse d'utilisation. Il fonctionne même avec les configurations modernes contrôlées par le compositeur, telles que WPStarter (avec une légère adaptation des règles .htaccess).