Prérequis
On va considérer l’installation d’un Wordpress multi-site sur une Ubuntu LTS 18.04, avec PHP 7.2.15, MySQL 5.7.25, la configuration qui m’a servi à tester ce que je vous propose dans cet article.
- Le site aura pour domaine
wpmulti.example
. - La langue du site sera en français de France.
- La base de données sera
wpmulti
. - L’utilisateur de la base de données sera
oleg
. Il devra avoir les droits nécessaires. - le multi-site sera par dossiers et non par sous-domaines.
Quelques actions préliminaires
Installation de WP CLI
Comme l’article porte sur WP CLI, il me semble judicieux de l’installer, pas vous ?
Rendez-vous sur le site de WP CLI pour en savoir plus, je vous propose l’installation rapide. Ouvrez un terminal et entrez les lignes suivantes :
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
$ sudo mv wp-cli.phar /usr/local/bin/wp
Vérifiez que tout va bien avec wp --info
:
OS: Linux 4.15.0-47-generic #50-Ubuntu SMP Wed Mar 13 10:44:52 UTC 2019 x86_64
Shell: /bin/bash
PHP binary: /usr/bin/php7.2
PHP version: 7.2.15-0ubuntu0.18.04.2
php.ini used: /etc/php/7.2/cli/php.ini
WP-CLI root dir: phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir: phar://wp-cli.phar/vendor
WP_CLI phar path: /home/michel/Git/wpmulti
WP-CLI packages dir:
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 2.0.1
Bien. Nous avons notre outil pour gérer Wordpress en ligne de commande.
Création de la base de données
Commençons par créer la base de données qui servira à accueillir les données de notre Wordpress multi-site. Dans votre client MySQL, faites ceci :
CREATE DATABASE wpmulti;
Création du dossier de l’application
Ensuite, créez le dossier qui contiendra le code source du site et placez-vous dedans :
mkdir wpmulti
cd wpmulti
L’installation de Wordpress en multi-site avec WP CLI
Installation de Wordpress
Maintenant, téléchargez la version FR de Wordpress dans le répertoire créé juste
avant à l’aide de la commande wp
en entrant ceci dans le terminal :
$ wp core download --locale="fr_FR"
Vous devriez avoir en sortie quelque chose comme ceci (avec sans doute un numéro de version différent selon le moment où vous lirez cet article) :
Downloading WordPress 5.3 (fr_FR)...
Using cached file '/home/michel/.wp-cli/cache/core/wordpress-5.3-fr_FR.tar.gz'...
Success: WordPress downloaded.
Configuration de base
À l’aide de wp
, on va créer le fichier de configuration de base, avec les hash
et les infos de connexion à la base de données MySQL. Notez que cette commande
contrôle aussi si la connexion à la base de données se fait bien.
$ wp config create \
--dbname="wpmulti" \
--dbuser="oleg" \
--dbpass="M0T2P4s53My5O1" \
--dbcharset="utf8mb4" \
--locale="fr_FR"
Les options parlent d’elles-même. Si tout se passe bien, vous devriez avoir cette sortie dans le terminal :
Success: Generated 'wp-config.php' file.
Faites un cat wp-config.php
dans le terminal pour voir vite fait le fichier
généré :
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the
* installation. You don't have to use the web site, you can
* copy this file to "wp-config.php" and fill in the values.
*
* This file contains the following configurations:
*
* * MySQL settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* @link https://codex.wordpress.org/Editing_wp-config.php
*
* @package WordPress
*/
// ** MySQL settings ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wpmulti' );
/** MySQL database username */
define( 'DB_USER', 'oleg' );
/** MySQL database password */
define( 'DB_PASSWORD', 'M0T2P4s53My5O1' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
/**
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
*
* @since 2.6.0
*/
define( 'AUTH_KEY', 'C1Y~LGxq|4.z2d4oJ>]Vp< |;uH)n*GBLYdV)&iF%>}0y_2F#&q ACw[I^3bKBn<' );
define( 'SECURE_AUTH_KEY', '%a-n9 r4s%~^n{YGe/8a58v eVNy4+r<:#g8y>A&hZay!3*41}Uym?Mw1LjMY8gh' );
define( 'LOGGED_IN_KEY', 'vwwYiQwO|u=JPtybOUUg=5SOj!?8oxi*({_0vkM~Sk`6*_Wz<7+@.(bzx/_(f|C)' );
define( 'NONCE_KEY', '9!fOE4rI00 bV,R^D>kBN,X+j^Hh&, _2b/32[2~nCdErpiv!dbr9<Zg2@z)MIe3' );
define( 'AUTH_SALT', 'pMmLV6|{Mv0Bui.dliRC!nI_K>xN)T}QBtHR={JAO*KDTrc`xOjNZaDaX_ok-DfC' );
define( 'SECURE_AUTH_SALT', 'k#4:&hd*rl&mn?`/Ml42U87X^7A[,*@A!n:W-+VUCCUVhncz#?OO/K9s/,N=<JD/' );
define( 'LOGGED_IN_SALT', 'Oki.gAfwq{+X>~=zc*.rU m8sasNb.AE$>^,pZ(:q0kNq`x~fNe|<+$__<1Mj4uf' );
define( 'NONCE_SALT', 'WG%AU(&iHezEKFyqj-EM%;<gw>hfZs]?m(& mylLJR@<rO#}YJL*=(AHpG==qUji' );
define( 'WP_CACHE_KEY_SALT', '$,`6*lTuEYAC|o(.sl*K2)>y~9B%Bt0@!}7M=/(F2p1$<pOCXX5F^,M8%Zse(`D,' );
/**
* WordPress Database Table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*/
$table_prefix = 'wp_';
/* That's all, stop editing! Happy blogging. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) )
define( 'ABSPATH', dirname( __FILE__ ) . '/' );
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
Parfait, tout semble correct.
Basculons vers le multisite
Reprenons en passant au vif du sujet, l’installation multisite de notre Wordpress :
$ wp core multisite-install \
--url="http://wpmulti.example" \
--title="Exemple multisite avec Wordpress" \
--admin_user="admin" \
--admin_password="5uP3RM0t2P4553" \
--admin_email="une.adresse@email.valide" \
--skip-email
N’oubliez pas le paramètre --url
, sinon, il vous faudra modifier quelques
tables en base de données.
Si tout se passe bien, en sortie, vous devriez avoir ceci :
Created single site database tables.
Set up multisite database tables.
Added multisite constants to 'wp-config.php'.
Success: Network installed. Don't forget to set up rewrite rules (and a .htaccess file, if using Apache).
Et le fichier wp-config.php
contient les nouvelles lignes suivantes :
define( 'WP_ALLOW_MULTISITE', true );
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', false );
$base = '/';
define( 'DOMAIN_CURRENT_SITE', 'wpmulti.example' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );
La constante SUBDOMAIN_INSTALL
est bien à FAUX
ici car on veut une
installation multi-site par sous-dossiers et non par sous-domaines. Il suffira
de passer cette constante à VRAI
pour utiliser les sous-domaines à la place
si le cœur vous en dit un jour.
Dans la dernière ligne de cette sortie du terminal, vous avez une mention
sur les réécritures d’URL à activer. Voici ce que vous devez faire dans le
cas d’Apache, à ajouter dans votre fichier .htaccess
dans le dossier
d’installation de votre Wordpress :
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
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]
Ou bien, vous pouver modifier le virtual host d’Apache pour ressembler à ceci :
<VirtualHost *:80>
ServerName wpmulti.example
DocumentRoot /dossier/de/votre/wordpress
# Custom log files, to differentiate from root server
ErrorLog ${APACHE_LOG_DIR}/error-wordpress-multi-site.log
CustomLog ${APACHE_LOG_DIR}/access-wordpress-multi-site.log combined
<Directory /dossier/de/votre/wordpress>
Options FollowSymLinks
AllowOverride Limit Options FileInfo
DirectoryIndex index.php
Require all granted
<IfModule mod_rewrite.c>
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]
</IfModule>
</Directory>
</VirtualHost>
Si vous utilisez un virtual host, pensez à l’ajouter à Apache et relancez ce dernier :
a2ensite votre_fichier_virtaul_host.conf
systemctl reload apache2
Voilà ! Votre multisite est prêt !
N’oubliez pas les permissions
Il nous reste plus qu’à attribuer les bonnes permissions aux fichiers et
dossiers de votre Wordpress. Dans la majeure partie des cas, votre site tourne
sous l’utilisateur Apache www-data
du groupe www-data
. Si vous avez
configuré ça autrement, adaptez les lignes suivantes (toujours dans le dossier
de votre Wordpress) à entrer dans votre terminal en tant que super-utilisateur :
chown -R www-data:www-data /dossier/de/votre/wordpress
find /dossier/de/votre/wordpress -type d -exec chmod 755 {} +
find /dossier/de/votre/wordpress -type f -exec chmod 644 {} +
Pour de plus amples explications sur ces dernières lignes, je vous recommande l’article de SkyMinds sur les permissions des fichiers et dossiers Wordpress.
Bien, tout est en place. Rendez-vous à l’aide de votre navigateur à l’adresse de votre site http://wpmulti.example/. Vous devriez y voir l’accueil du site s’afficher.
Les sous-sites
Maintenant que le site Wordpress est configurer pour faire des sous-sites,
voyons ce qui se passe en base de données à l’aide de notre ami wp
:
$ wp site list
Vous devriez avoir en sortie quelque chose comme ça :
+---------+-------------------------+---------------------+---------------------+
| blog_id | url | last_updated | registered |
+---------+-------------------------+---------------------+---------------------+
| 1 | http://wpmulti.example/ | 0000-00-00 00:00:00 | 2019-12-12 11:07:22 |
+---------+-------------------------+---------------------+---------------------+
Comme vous vous en doutez, nous n’avons qu’un seul site encore, normal, on n’a pas créé de sous-site.
On va voir dans un premier temps comment ajouter un site avec wp
et ensuite comment
le faire dans l’interface d’administration de Wordpress.
Avec WP CLI
Admettons qu’on souhaite créer le sous-site machin
. Entrez la commande suivante :
$ wp site create --slug="machin"
Notez que le slug
sera utilisé pour le dossier ainsi que pour le sous-domaine
si un jour vous changez le configuration pour utiliser des sous-domaines à la
place.
Si tout se passe bien, la sortie dans le terminal doit être :
Success: Site 2 created: http://wpmulti.example/machin/
OK. Reprenons la commande listant les sites, wp site list
:
+---------+--------------------------------+---------------------+---------------------+
| blog_id | url | last_updated | registered |
+---------+--------------------------------+---------------------+---------------------+
| 1 | http://wpmulti.example/ | 0000-00-00 00:00:00 | 2019-12-12 11:07:22 |
| 2 | http://wpmulti.example/machin/ | 2019-12-12 11:32:35 | 2019-12-12 11:32:35 |
+---------+--------------------------------+---------------------+---------------------+
Il est bien là !
Avec le backoffice de Wordpress
Identifiez-vous dans la partie administration du site et examinez ce qu’il y a en haut à gauche : un nouveau menu.
Allez dans Mes sites → Admin du réseau → Sites, comme le montre cette capture d’écran :
Vous voilà sur la page gérant les sous-sites, et les listant.
Cliquez sur le bouton « Ajouter » situé en haut de la liste. Remplissez le formulaire qui apparaît alors, avec comme exemple un sous-site « truc » :
Validez. Vous êtes alors redirigé⋅e vers la liste des sous-sites, contenant le site nouvellement ajouté.
C’est bien le cas avec WP CLI aussi :
+---------+--------------------------------+---------------------+---------------------+
| blog_id | url | last_updated | registered |
+---------+--------------------------------+---------------------+---------------------+
| 1 | http://wpmulti.example/ | 0000-00-00 00:00:00 | 2019-12-12 11:07:22 |
| 2 | http://wpmulti.example/machin/ | 2019-12-12 11:32:35 | 2019-12-12 11:32:35 |
| 3 | http://wpmulti.example/truc/ | 2019-12-12 11:45:26 | 2019-12-12 11:45:26 |
+---------+--------------------------------+---------------------+---------------------+
En principe, si vous vous rendez sur http://wpmulti.example/, http://wpmulti.example/machin/ et http://wpmulti.example/truc/ vous devriez avoir du contenu !
Conclusion
On a vu la base de la création/gestion multisite de Wordpress avec WP CLI. Mais il y a d’autres possibilités plus poussées, et pour cela, je vous invite vivement à regarder les différentes options qu’offre WP CLI.
Les aventages de cette approche est que vous pouvez créer des scripts bash pour automatiser la création de sites Wordpress et leur maintenance. Dans un contexte multisite, cela est partuiculièrement intéressant.
À vous de jouer maintenant !