Installation d’un projet WordPress : du Repository au composer.json

Cet article se décompose en plusieurs grandes parties listées ci-dessous et nous permettra de voir comment installer un projet WordPress via Composer, de la création du Repository sur GitHub à la configuration du fichier composer.json.

Vous pouvez également consulter le projet sur GitHub : WordPress Repository

Niveau : Débutant

Prérequis :

  • Connaissances :
  • Logiciels :
    • Avoir un compte Github
    • Installer PHP (globalement)
    • Installer Composer sur votre ordinateur (globalement)

Image de couverture de l'article sur l'installation d'un projet WordPress

1. Créer son Repository Github

Avant tout, commençons par nous créer un repository GitHub vide. Connectez-vous à votre compte, allez dans Repositories et cliquer sur New.

Puis configurer votre Repository, ce qui va créer un dossier sur le site GitHub dans lequel vous trouverez tous les fichiers de votre projet.

  • Template : Dans notre cas, nous partons d’une coquille vide.
  • Owner / Repository name : Je sélectionne mon compte et je précise le nom de mon Repository avec des « – » à la place des espaces et tout en minuscule. Exemple : wordpress-repository
  • Description : Expliquer en quelques mots ce que fait notre Repository. Exemple : A simple WordPress website.
  • Visibility : « Public » pour que tout le monde puisse y avoir accès ou « Private » pour restreindre l’audience.
  • Readme : Par défaut, j’ajoute toujours un Readme à destination d’autres développeurs. Cela va créer un ficher README.md dans lequel je mettrai des indications pour expliquer comment installer et utiliser le projet.
  • License : au choix, en fonction de vos attentes en terme de licence. Voir les différentes options ici.

2. Vérifier la configuration de votre ordinateur / environnement

Commençons par ouvrir notre Terminal puis, avec les commandes suivantes, vérifions avant tout :

  • Notre version de PHP : php -v
  • Notre version de Composer : composer -v

Dans notre cas, nous travaillons avec PHP 8.1.13 et Composer 2.5.5.

Pour faire (très) simple, Composer est un logiciel qui nous permettra de télécharger et d’installer des bibliothèques et des packages. En d’autres termes, du code écrit par d’autres développeurs pour nous éviter de le refaire et nous permettre de développer plus vite, plus sereinement.

Dans le monde du développement, on préfèrera utiliser du code déjà existant, testé, approuvé et sur lequel plusieurs personnes travaillent, plutôt que de devoir tout réécrire soit même au risque de créer un code moins sécurisé et performant. « On ne réinvente pas la roue » comme dirait notre cher Noweh 😀

3. Télécharger (cloner) le contenu du Repository sur votre ordinateur

Cette étape vous permettra de télécharger le contenu de votre Repository dans votre ordinateur, à l’endroit où vous avez entré la commande git clone.

A noter : En terme technique, nous préférons dire « cloner » car nous faisons littéralement une copie du dossier sur notre ordinateur, le terme « télécharger » dans notre contexte sera plutôt réservé au bouton « Download ZIP » (voir screenshot) qui télécharge littéralement le projet sur notre ordinateur dans un .zip.

Avant de commencer à configurer les fichiers qui nous permettrons d’installer notre site WordPress en ligne de commande, nous devons :

  • Aller dans votre Repository sur GitHub en cliquant sur le bouton code, puis dans l’onglet SSH copiez le lien :
  • Nous placer dans le bon dossier depuis le Terminal. Naviguez jusqu’au dossier comprenant tous vos sites à l’aide des commandes suivantes :
    • cd (change directory) : Changer de dossier.
    • pwd (print working directory): Afficher le chemin du dossier dans lequel on se trouve.
    • ls (lire « LS » en minuscules – short for “list”) : Afficher le contenu d’un dossier.

Une fois dans le bon dossier, depuis votre Terminal, entrez la commande git clone suivi du lien SSH copié précédemment (exemple git clone git@github.com:Rapkalin/wordpress-repository.git) puis allez dans le dossier téléchargé / cloné avec cd suivi du nom du dossier (exemple cd wordpress-repository).

Pour aller plus loin

Il existe une autre méthode qui vous permet de choisir vous même le nom du dossier dans lequel sera cloné le projet. Pour cela il vous faudra :

  • Créer le dossier avec le nom de votre choix grâce à la commande mkdir suivie du nom du dossier (exemple mkdir mon-dossier-wordpress).
  • Puis saisir cd suivi du nom du dossier (exemple cd mon-dossier-wordpress).
  • Enfin, rentrer la commande git clone comme fait précédemment mais cette fois en ajoutant un espace suivi d’un point à la suite (exemple git clone git@github.com:Rapkalin/wordpress-repository.git .).

4. Configurer votre fichier composer.json

Depuis la racine de votre projet, nous allons configurer ce dernier avec la création d’un fichier composer.json. Entrez la commande composer init qui, comme son nom l’indique, initiera la création du fichier composer.json.

J’ai découpé les réponses en plusieurs catégories pour simplifier la lecture :

Les questions sur le projet

  • Package name : Le nom de votre projet. Laisser vide pour prendre le nom par défaut. Dans notre cas : r.kalinowski/wordpress-repository.
  • Description : La description de votre projet. Dans notre cas : A simple WordPress website.
  • Author : Les auteurs.
  • Minimum Stability : La stabilité minimum attendue pour les composants externes qui seront installés. Exemple : Si vous voulez installer un plugin/package pour faire fonctionner votre projet, il faut au minimum que la version du package soit celle indiquée ici.
  • Package Type : Permet de définir la typologie de votre projet, pour en savoir plus rendez-vous sur Stackoverflow. Dans notre cas nous choisissons le type project.
  • License : Si vous souhaitez indiquer une licence d’utilisation, la plupart du temps la licence MIT convient. Dans notre cas nous la laissons vide.

Les questions sur la configuration du projet

  • Define your dependencies : Par défaut, nous choisissons de définir les dépendances interactivement en utilisant la commande composer require. Une autre possibilité consiste à les ajouter manuellement dans le composer.json, mais cela nécessitera une suppression du fichier composer.lock, nous verrons cela un peu plus bas. Dans le composer.json cela correspond à la section require.
  • Search for a package : C’est ici que vous entrez les packages dont votre projet a besoin. Vous pourrez en ajouter / retirer plus tard – avec la commande composer require + nom du package. Dans notre cas, voici les packages requis à ajouter :
    • johnpbloch/wordpress : Le cœur (core) WordPress.
    • composer/installers : Aide à l’installation des packages au bon endroit en créant notamment un dossier nommé vendor ou en permettant de créer des chemins personnalisés ce qui va nous intéresser ici.
    • vlucas/phpdotenv : Un package qui permet d’interpréter un fichier .env dans lequel nous indiquerons des informations sensibles à notre projet (nom de la base de données, mots de passe etc.).
    • Notre thème : Nous verrons ce point dans un second temps.
  • Dev dependencies : Ce sont des dépendances / packages qui ne sont utilisé(e)s que dans le cadre du développement (par exemple, pour nous aider à débuguer notre projet). Dans notre cas, nous n’en avons pas. Dans le composer.json cela correspond à la section require-dev.
  • Add PSR-4 autoload mapping : Je l’ajoute toujours par défaut, cela permet à notre application / projet de détecter les fichiers respectant ce standard.

L’installation des dépendances

  • Do you confirm generation? : Cela nous donne un aperçu du fichier qui sera généré. Comme précisé plus haut, si quelque chose ne va pas, nous pourrons de toute façon le modifier par la suite donc : YES 🙂
  • Would you like the vendor director to be added in .gitignore? : Pour ignorer le dossier vendor lorsque notre projet sera envoyé sur Github.
  • Would you like to install dependencies now? : Dans notre cas non, car nous allons encore compléter notre composer.json avant l’installation des dépendances. A noter qu’un fichier composer.lock s’installera à ce moment, nous y reviendrons plus bas.

Et voilà le résultat :

5. Ajout des chemins d’installation du projet WordPress personnalisés (custom path)

Avant tout, revoyons un peu l’arborescence de notre projet. A l’intérieur de notre projet wordpress-repository, nous avons maintenant plusieurs dossiers :

  • src : Qui comprendra l’ensemble du code de notre site et que nous allons renommer en website.
  • .gitignore : Qui liste les fichiers à ignorer lors de l’upload du projet sur GitHub.
  • composer.json : Qui permet de configurer l’installation du projet.
  • README.md : Qui permet de donner des indications aux autres développeurs sur l’installation du projet.

Par ailleurs, si tout est correct, le fichier composer.json devrait contenir les éléments précédemment ajoutés lors de l’initialisation. Et donc ressembler au bloc de code ci-dessous :

{
    "name": "r.kalinowski/wordpress-repository",
    "description": "A simple WordPress website",
    "type": "project",
    "authors": [
        {
            "name": "Raphael Kalinowski",
            "email": "raphael@myminicom.com"
        }
    ],
    "require": {
        "johnpbloch/wordpress": "^6.2",
        "composer/installers": "^2.2",
        "vlucas/phpdotenv": "^5.5",
    },
    "autoload": {
        "psr-4": {
            "Rapkalin\\": "website/"
        }
    },
}

A noter : Lorsque vous indiquez un chemin personnalisé, il faut partir de l’endroit où se trouve votre composer.json. Dans notre cas, le composer.json étant au même niveau que le dossier website, si nous voulons installer des éléments dans ce même dossier (website) il faudra préciser website/nom-du-dossier.

Nous allons commencer par renommer notre dossier src en website. Nous modifions de la même manière le nom du dossier dans la section autoload du fichier composer.json. Vous pouvez nommer votre dossier comme bon vous semble, ici mon choix se porte sur des habitudes liées à mon travail 🙂

Nous ajoutons ensuite un sous-dossier app dans website dans lequel se trouvera le code personnalisé / custom de notre application : notre thème personnalisé, nos fichiers de style (.css, .js), tous les médias (images, vidéos etc.) affichés sur notre site qui se trouveront dans le dossier uploads, etc.

Puis nous allons ajouter plusieurs entrées :

  • repositories : Indique les plateformes sur lesquelles Composer doit aller chercher les packages. Par défaut le répertoire installé est celui de Composer : packagist.org. Dans notre cas nous allons avoir besoin d’aller chercher le thème sur le site wpackagist.org de WordPress.
  • require : nous ajoutons notre thème hugo-wp avec la ligne "wpackagist-theme/hugo-wp":"1.0.6" ainsi qu’un 1er plugin w3-total-cache avec la ligne "wpackagist-plugin/w3-total-cache":"2.3.2"
  • require-dev : Ce sont les dépendances utilisées uniquement au moment du développement. Elles ne sont pas utilisées en mode production. Nous vous recommendons d’ajouter une nouvelle dépendance : roave/security-advisories. Lors de l’installation & update du projet, elle vérifie que les packages ne comportent pas de failles de sécurité.
  • config : Permet de préciser des comportements ou de la configuration supplémentaire lors de l’installation du projet. En savoir plus sur la partie config du composer.json. Nous ajoutons dans cette section :
    • allow-plugins qui permet d’autoriser des plugins à éxecuter du code lors de l’installation. Puis nous ajoutons 2 entrées dans cette section :
      • johnpbloch/wordpress-core-installer.
      • composer/installers : Ce dernier aide à l’installation des packages au bon endroit notamment en créant un dossier vendor.
    • vendor-dir : Par défaut, le dossier vendor est installé à la racine du projet, au même niveau que notre dossier website, dans notre cas on préfère les avoir dans ce dernier. Je redéclare donc ici le chemin d’installation du dossier vendor : website/vendor.
  • extra : C’est ici que nous ajoutons nos chemins d’installations personnalisés.
    • wordpress-install-dir : Indiquer ici le chemin d’installation personnalisé du coeur (core) WordPress. Dans notre cas, tout ira à l’intérieur du dossier wordpress-core qui se trouve lui même dans le dossier website. Vous pouvez changer le nom du dossier wordpress-core et mettre ce que vous voulez.
    • installer-paths : C’est ici que nous définissons nos chemins personnalisés en respectant un standard d’écriture qui se compose de 2 parties : entre guillemets le chemin d’installation et entre crochets le type d’élément installé. Voyons cela de plus près pour chacune de nos lignes ajoutées :
      • "website/app/themes/{$name}/":[type:wordpress-theme] :
        • "website/app/themes/{$name}/" : Le chemin où nous souhaitons installer les thèmes, ici : website/app/themes. Vous pouvez également choisir de n’installer qu’un seul thème ici et le reste dans le dossier par défaut, dans ce cas remplacer {$name} par le nom du thème (exemple : website/wordpress/wp-content/themes/NomDuTheme/)
        • [type:wordpress-theme] : Leur type associé, dans notre cas, wordpress-theme
      • "website/app/plugins/{$name}/":[type:wordpress-plugin] :
        • "website/app/plugins/{$name}/" : Le chemin où nous souhaitons installer les plugins, ici : website/app/plugins/
        • [type:wordpress-plugin] : Leur type associé, dans notre cas, wordpress-plugin

Voici le résultat final du composer.json, il ne reste plus qu’à lancer l’installation avec la commande composer install :

{
    "name": "rapkalin/wordpress-repository",
    "description": "A simple WordPress website",
    "type": "project",
    "keywords": [
        "wordpress"
    ],
    "authors": [
        {
            "name": "Rapkalin",
            "email": "raphael@myminicom.com"
        }
    ],
    "repositories":[
        {
            "type":"composer",
            "url":"https://wpackagist.org",
            "only": [
                "wpackagist-plugin/*",
                "wpackagist-theme/*"
            ]
        }
    ],
    "require": {
        "php": ">=7.3",
        "johnpbloch/wordpress": "^6.2",
        "composer/installers": "^2.2",
        "vlucas/phpdotenv": "^5.5",
        "wpackagist-theme/hugo-wp":"1.0.6",
        "wpackagist-plugin/w3-total-cache":"2.3.2"
    },
    "require-dev": {
        "roave/security-advisories": "dev-latest"
    },
    "autoload": {
        "psr-4": {
            "Rapkalin\\": "website/"
        }
    },
    "config": {
        "vendor-dir": "website/vendor",
        "allow-plugins": {
            "composer/installers": true,
            "johnpbloch/wordpress-core-installer": true
        }
    },
    "extra": {
        "wordpress-install-dir": "website/wordpress-core",
        "installer-paths": {
            "website/app/themes/{$name}/": [
                "type:wordpress-theme"
            ],
            "website/app/plugins/{$name}/": [
                "type:wordpress-plugin"
            ]
        }
    }
}

6. Vérifier l’installation

Vérifions maintenant notre installation.

A cette étape, l’arborescence de votre projet devrait être la suivante :

Quelques points de vérification importants :

  • Le dossier wordpress est bien dans website
  • Le dossier vendor est bien dans website
  • Le thème s’est bien installé dans le dossier website/app/themes
  • Le composer.lock a bien été généré à la racine : A noter, le composer.lock s’installe lors de l’installation des packages quand vous entrez la commande composer install, si vous updatez votre composer.json il faudra le re-générer en le supprimant ou en tapant la commande composer update

7. Finaliser la configuration avec les fichiers wp-config.php et index.php

Pour finaliser la configuration de notre projet WordPress, nous allons avoir besoin de 2 fichiers :

  • index.php : Nous créons ce nouveau qui sera placé dans le dossier website. C’est vers ce fichier que votre vhost devra pointer et qui sera le point d’entrée de notre application. Ce dernier ne fera que cibler le fichier index.php d’un projet WordPress classique qui se situe dans wordpress-code/index.php.
  • wp-config.php : C’est dans ce fichier que se trouve la configuration de notre site WordPress, comme par exemple l’URL de notre site, du back-office etc. Il ne nous reste plus qu’à configurer ce dernier. Pour cela, copiez le fichier wp-config-sample.php qui se trouve dans le dossier wordpress-core, collez-le à la racine du dossier website et renommez-le en wp-config.php.

A cette étape, l’arborescence de votre projet devrait être la suivante :

step-7-project-tree

Voici à quoi doit ressembler le contenu de votre fichier index.php situé à la racine du dossier website :

<?php

require_once __DIR__ . '/wordpress-core/index.php';

Nous allons ensuite supprimer les lignes ci-dessous dans le fichier wp-config.php :

<?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:
 *
 * * Database settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://wordpress.org/documentation/article/editing-wp-config-php/
 *
 * @package WordPress
 */

// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );

/** Database username */
define( 'DB_USER', 'username_here' );

/** Database password */
define( 'DB_PASSWORD', 'password_here' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

Ajouter les lignes suivantes cette fois, au début du fichier :

<?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:
 *
 * * Database settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://wordpress.org/documentation/article/editing-wp-config-php/
 *
 * @package WordPress
 */

define('DIR_VENDOR', __DIR__.'/vendor/');

// Autoloader
if (file_exists(DIR_VENDOR . 'autoload.php')) {
    require_once(DIR_VENDOR . 'autoload.php');
}

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$env = $dotenv->load();

// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', $env['DATABASE_NAME'] );

/** Database username */
define( 'DB_USER', $env['DATABASE_USER'] );

/** Database password */
define( 'DB_PASSWORD', $env['DATABASE_PASSWORD'] );

/** Database hostname */
define( 'DB_HOST', $env['DATABASE_HOST'] );

/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

Le dossier wp-content

Arrêtons-nous un moment sur ce dossier qui est essentiel au bon fonctionnement de notre site.

WordPress attend un dossier wp-content qui se situe nativement dans wordpress-core/wp-content. C’est dans ce dossier que se trouve nos thèmes, nos plugins ainsi que tous les médias qui sont affichés sur notre site (images, vidéos etc.).

A chaque fois que WordPress est installé via le composer.json ou mis à jour, ce dossier sera écrasé ce que nous ne souhaitons pas. Il existe une solution pour palier à ce problème. Précédemment, nous avons créé un dossier app, c’est dans ce dernier que nous mettrons tout le contenu du dossier wp-content attendu par WordPress.

Il faut donc indiquer à WordPress que le contenu du dossier wp-content se trouve maintenant dans le dossier website/app grâce aux lignes ci-dessous que nous ajouterons entre les lignes /* Add any custom values between this line and the "stop editing" line. */ et /* That's all, stop editing! Happy publishing. */

/* Add any custom values between this line and the "stop editing" line. */

/** Define a custom path to the config.php file */
if ( ! defined( 'ABSPATH' ) ) {
    define( 'ABSPATH', __DIR__ . 'wp-config.php/');
}

/** Define a custom default theme */
define( 'WP_DEFAULT_THEME', 'hugo-wp' );

/** Define a custom content directory */
define ('WP_CONTENT_DIR', __DIR__ . '/app');
define ('WP_CONTENT_URL', $env['WP_CONTENT_URL'] . 'app');
define( 'WP_SITEURL',  $env['WP_SITEURL'] . 'wordpress-core/');

/* That's all, stop editing! Happy publishing. */

Quelques explications s’imposent. Revenons sur ce package que nous avons installé au début : vlucas/phpdotenv. Mais à quoi sert-il ? Il nous permet d’interpréter un fichier.env dans lequel nous indiquerons des informations sensibles à notre projet (nom de la base de données, mots de passe etc.). Voici un aperçu du contenu du .env :

DATABASE_NAME='nom-de-votre-database'
DATABASE_USER='votre-username'
DATABASE_PASSWORD='votre-password'
# En local ce sera simplement 'localhost'
DATABASE_HOST='votre.host.com'

WP_CONTENT_URL='http://example.local/'
WP_SITEURL='http://example.local/'

Puis nous allons charger le package lucas/phpdotenv dans notre fichier wp-config.php, ce qui va nous permettre de récupérer toutes ces données sensibles de manière anonyme dans la variable $env.

<?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:
 *
 * * Database settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://wordpress.org/documentation/article/editing-wp-config-php/
 *
 * @package WordPress
 */

define('DIR_VENDOR', __DIR__.'/vendor/');

// Autoloader
if (file_exists(DIR_VENDOR . 'autoload.php')) {
    require_once(DIR_VENDOR . 'autoload.php');
}

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$env = $dotenv->load();

Vous pouvez maintenant sauvegarder le fichier wp-config.php sur votre Github tout en gardant le fichier .env bien au chaud sur votre ordinateur. Attention de bien ajouter une ligne dans votre .gitignore pour ignorer le fichier .env et ne pas qu’il soit envoyé sur votre Repository Github.

Si vous travaillez avec d’autres développeurs, il faudra leurs communiquer discrètement (par mail, Teams, Zoom, téléphone etc.) les détails de votre fichier .env. Cela permet de préserver un certain niveau de sécurité sur vos apps et de protéger vos données sensibles.

Votre .envVotre wp-config.php
DATABASE_NAME
DATABASE_USER
DATABASE_PASSWORD
DATABASE_HOST
WP_CONTENT_URL
WP_SITEURL
$env[‘DATABASE_NAME’]
$env[‘DATABASE_USER’]
$env[‘DATABASE_PASSWORD’]
$env[‘DATABASE_HOST’]
$env[‘WP_CONTENT_URL’]
$env[‘WP_SITEURL’]

8. Quelques tips

Personnaliser les liens URL de ses articles

Si vous souhaitez changer la structure des URLs qui sont générées pour les personnaliser :

  • Depuis le menu dans l’admin, aller dans Réglages > Permaliens
  • Choisissez le format souhaité
  • Enregistrez vos modifications

Cette action va générer automatique un fichier .htaccess qu’il faudra impérativement mettre dans votre Repository.

Un fichier .htaccess peut gérer différentes choses dont des redirections ou restreindre l’accès à votre site avec un identifiant et un mot de passe.

Trouver la bonne ligne à ajouter pour son thème

  • Dans un premier temps, cherchez le thème que vous souhaitez sur la plateforme dédiée aux thèmes WordPress.
  • Une fois que vous avez sélectionné votre thème, récupérez son nom « technique » dans l’URL :
Capture d'écran d'un thème WordPress
  • Puis rendez-vous sur wpackagist.org pour récupérer la ligne à ajouter en cliquant sur la version souhaitée à droite, il ne vous reste plus qu’à copier cette ligne dans votre entrée require de votre composer.json.

Bon code 🙂

2 thoughts on “Installation d’un projet WordPress : du Repository au composer.json

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.