Le moteur de Blog/CMS Wordpress peut être utilisé en mode multisite. Une installation pouvant gérer plusieurs « sous-sites » dans des sous-domaines ou des dossiers. Nous allons voir comment faire ça avec la ligne de commande et l’outil WP CLI.


Partager l’article Installer un Wordpress multisite en ligne de commande avec WP-CLI sur les réseaux sociaux


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 :

Menu dans l’administration de Wordpress permettant de gérer les sous-sites

Vous voilà sur la page gérant les sous-sites, et les listant.

Portion de la page listant les sites, avec le bouton ajouter en haut.

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

Formulaire d’ajout d’un site avec les champs remplis.

Validez. Vous êtes alors redirigé⋅e vers la liste des sous-sites, contenant le site nouvellement ajouté.

Portion de la page listant les sites, avec le nouveau site fraîchement ajouté qui apparaît.

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 !

Photo de Pixabay sur Pexels