WordPress est un CMS (Content Management System) Open Source sous licence GPLv2 écrit en PHP et reposant sur un système de gestion de bases de données MySQL. Il est distribué par la société américaine Automattic depuis 2003 (version 0.70) et permet la création de sites Web, blogs, sites d’e-commerce ou de portfolios. Il peut être auto-hébergé ou être mis en place via les sites WordPress.org ou WordPress.com.
Ses versions majeures portent le nom de célébrités du Jazz comme la version 1.0 nommée Miles (pour Miles Davis) ou la version 4.9 nommée Tipton (pour Billy Tipton).
WordPress représente aujourd’hui près de 30% de l’ensemble des sites Web à travers le monde (Joomla 3%, Drupal 2%, sans CMS 55%) et près de 60% des sites créés via un CMS (Joomla 7%, Drupal 5%, Magento 3%, Blogger 2%).
Comparatif WordPress 0.7.0 et WordPress 4.9.6 :
Objectif
L’objectif de cet article est l’installation et la configuration d’un serveur auto-hébergé WordPress en version 4.9.6 sur une distribution Linux Debian Stretch 9.4 64bits.
Schéma logique
Pré-requis
1. Pré-requis avant réalisation
- Un serveur Debian Stretch 9.4 64 bits fonctionnel (installation basique avec utilitaires usuels du système et service SSH)
- Packages de base supplémentaires : resolvconf, tree, dnsutils
- Domaine utilisé : opensharing.priv
2. Configuration réseau initiale
Serveur WordPress | |
FQDN | wp-test.opensharing.priv |
Adresse IP | 192.168.1.14 |
Réseau | 192.168.1.0/24 |
Passerelle | 192.168.1.1 |
dns-nameservers | 192.168.1.11 192.168.1.12 |
dns-search | opensharing.priv |
Contenu initial du fichier /etc/network/interfaces :
auto lo iface lo inet loopback allow-hotplug enp0s3 iface enp0s3 inet static address 192.168.1.14 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 dns-search opensharing.priv dns-nameservers 192.168.1.11 192.168.1.12
Contenu initial du fichier /etc/hosts :
127.0.0.1 localhost.localdomain localhost 192.168.1.14 wp-test.opensharing.priv wp-test 192.168.1.14 www.opensharing.priv www
Rmq : L’adresse 127.0.1.1 doit être retirée sur un serveur à IP fixe et remplacée par cette dernière, tel que l’exemple ci-dessus.
Contenu initial du fichier /etc/host.conf :
order hosts, bind multi on
Contenu initial du fichier /etc/resolv.conf :
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 192.168.1.11 nameserver 192.168.1.12 search opensharing.priv
Rmq :
Le fichier /etc/resolv.conf ne doit pas être édité dès lors que le paquet resolvconf a été installé.
Pour prendre en compte les modifications des fichiers de configuration relatifs au réseau, redémarrage du service réseau :
# systemctl restart networking # ifup enp0s3
Optionnel : Création d’un alias global reprenant la commande ifconfig disparue sous Debian Stretch
# nano /etc/bash.bashrc
alias ifconfig='ip addr'
# source /etc/bash.bashrc
Réalisation
1. Installation de Apache
# apt install apache2 apache2-doc
Installe les paquets suivants par dépendances :
apache2 | apache2-bin | apache2-data | apache2-doc |
apache2-utils | libapr1 | libaprutil1 | libaprutil1-dbd-sqlite3 |
libaprutil1-ldap | ssl-cert |
2. Installation de MariaDB
# apt install mariadb-server mariadb-client
Installe les paquets suivants par dépendances :
galera-3 | gawk | libcgi-fast-perl | libcgi-pm-perl |
libdbd-mysql-perl | libdbi-perl | libfcgi-perl | libhtml-template-perl |
libsigsegv2 | libterm-readkey-perl | mariadb-client | mariadb-client-10.1 |
mariadb-server | mariadb-server-10.1 | psmisc | rsync |
3. Installation de PHP
# apt install php php-mysql php-imagick
Installe les paquets suivants par dépendances :
gawk | php | php-common | php-imagick |
php-mysql | php7.0 | php7.0-cli | php7.0-common |
php7.0-json | php7.0-mysql | php7.0-opcache | php7.0-readline |
ttf-dejavu-core |
Configuration du moteur de cache Opcache permettant le stockage en mémoire des scripts PHP précompilés pour un gain de performance :
# nano /etc/php/7.0/mods-available/opcache.ini
Ajouter les lignes suivantes en fin de fichier :
opcache.memory_consumption=512 opcache.revalidate_freq=60 opcache.validate_timestamps=1 opcache.max_accelerated_files=5000
4. Installation de phpMyAdmin
# apt install phpmyadmin
Choisir le serveur web à reconfigurer automatiquement, dans notre cas apache2.
Faut-il configurer la base de données de phpmyadmin avec dbconfig-common ? Non
Nous allons le faire manuellement plus loin.
Installe les paquets suivants par dépendances :
dbconfig-common | dbconfig-mysql | libcurl3 | libjs-sphinxdoc |
php-bz2 | php-curl | php-gd | php-mbstring |
php-pear | php-php-gettext | php-phpseclib | php-tcpdf |
php-xml | php-zip | php7.0-bz2 | php7.0-curl |
php7.0-gd | php7.0-mbstring | php7.0-xml | php7.0-zip |
phpmyadmin |
5. Configuration de MariaDB
On peut, pour le moment, se loguer sans mot de passe (la touche entrée sur une chaîne vide suffit). C’est donc la première chose à corriger.
# mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 10 Server version: 10.1.26-MariaDB-0+deb9u1 Debian 9.1 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [mysql]> update user set plugin='mysql_native_password' where user='root'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [mysql]> flush privileges; Query OK, 0 rows affected (0.00 sec) MariaDB [mysql]> quit; Bye
Il faut maintenant définir un mot de passe pour root et corriger quelques paramètres de sécurité par défaut.
# mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. Set root password? [Y/n] Y New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] Y ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] Y ... Success! By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] Y - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] Y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB!
Maintenant connectons-nous avec le mot de passe root système et créons la base de données qui accueillera WordPress.
# mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 10 Server version: 10.1.26-MariaDB-0+deb9u1 Debian 9.1 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS wordpressdb; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> CREATE USER wpadmin@localhost IDENTIFIED BY "wpadminpw"; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpressdb.* TO wpadmin@localhost; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | wordpressdb | +--------------------+ 4 rows in set (0.00 sec) MariaDB [(none)]> quit; Bye
6. Installation de WordPress
# mkdir /root/downloads/ # cd /root/downloads/ # wget https://fr.wordpress.org/wordpress-4.9.6-fr_FR.tar.gz # tar zxvf wordpress-4.9.6-fr_FR.tar.gz -C /var/www/ # mkdir /var/www/wordpress/wp-content/uploads/ # chown -R www-data:www-data /var/www/wordpress/ # cp -a /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php # nano /var/www/wordpress/wp-config.php
/** Nom de la base de données de WordPress. */ define('DB_NAME', 'wordpressdb'); /** Utilisateur de la base de données MySQL. */ define('DB_USER', 'wpadmin'); /** Mot de passe de la base de données MySQL. */ define('DB_PASSWORD', 'wpadminpw'); ... /** * Préfixe de base de données pour les tables de WordPress. * * Vous pouvez installer plusieurs WordPress sur une seule base de données * si vous leur donnez chacune un préfixe unique. * N’utilisez que des chiffres, des lettres non-accentuées, et des caractères soulignés ! */ $table_prefix = 'wpos_'
Rmq : Le prefixe est à personnaliser, à la place de wp_, par simple sécurité pour éviter les codes automatisés d’injections SQL.
7. Configuration de Apache
Rmq : La modification ou la création d’un fichier .htaccess doit se faire uniquement si l’on n’a pas accès à la configuration Apache des VirtualHosts (dans le cas d’un hébergement de site où nos droits d’accès sont restreints à la racine du site par exemple), ou alors pour des tests, mais elle est à proscrire autant que faire se peu en production. Les mêmes règles définies dans un .htaccess peuvent être écrites dans la configuration d’un VirtualHost dans le Directory correspondant.
# nano /var/www/wordpress/.htaccess
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
# a2enmod rewrite
# nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80> ServerAdmin admin@opensharing.priv <Directory /var/www/wordpress/> Require all granted AllowOverride All </Directory> DocumentRoot /var/www/wordpress/ ServerName www.opensharing.priv ErrorLog /var/log/apache2/wordpress.error.log CustomLog /var/log/apache2/access.log combined </VirtualHost>
# service apache2 restart # service mysql restart
8. Configuration de WordPress par le navigateur Web
Saisir, dans la barre d’adresses, l’adresse suivante :
http://wp-test.opensharing.priv
redirigeant automatiquement vers :
http://wp-test.opensharing.priv/wp-admin/install.php
ou
http://www.opensharing.priv
redirigeant automatiquement vers :
http://www.opensharing.priv/wp-admin/install.php
Si le CNAME www.opensharing.priv pour wp-test.opensharing.priv est enregistré sur le DNS primaire.
Le formulaire proposé est tout ce qu’il y a de plus simple et succinct.
Après quelques secondes, le Tableau de bord de l’administrateur de WordPress (en version 4.9.6), précédemment défini, apparait.
Si l’on se déconnecte et accède à l’URL www.opensharing.priv, notre site s’affiche avec le thème Twenty Seventeen, activé par défaut.
Pour accéder à nouveau au Tableau de bord de l’administrateur, saisir l’URL suivant :
http://www.opensharing.priv/wp-login.php
Sécurisation du dossier wordpress :
# find /var/www/wordpress/ -type f -print0 | xargs -0 chmod 0644 # find /var/www/wordpress/ -type d -print0 | xargs -0 chmod 0755 # find /var/www/wordpress/wp-content/ -type d -print0 | xargs -0 chmod 0775 # chown -R root:root /var/www/wordpress/ # chown -R www-data:www-data /var/www/wordpress/wp-content/ # chown root:www-data /var/www/wordpress/.htaccess # systemctl restart apache2 # systemctl restart mysql
Pour aller plus loin
1. Arborescence initiale des fichiers Web
# tree -L 1 /var/www/wordpress/
/var/www/wordpress/
├── index.php
├── license.txt
├── readme.html
├── wp-activate.php
├── wp-admin/
├── wp-blog-header.php
├── wp-comments-post.php
├── wp-config-sample.php
├── wp-content/
├── wp-cron.php
├── wp-includes/
├── wp-links-opml.php
├── wp-load.php
├── wp-login.php
├── wp-mail.php
├── wp-settings.php
├── wp-signup.php
├── wp-trackback.php
└── xmlrpc.php
Pour une description de ces fichiers : WordPress.org – Codex
2. Arborescence initiale des fichiers de bases de données
Les fichiers de bases de données sont stockés dans /var/lib/mysql/dbname/.
Chaque table de la base de données wordpressdb est représentée par 3 fichiers :
- prefix_tablename.frm : description du format de la table (définition de la table)
- prefix_tablename.idb : (fichier InnoDB) données et index de la table
# tree /var/lib/mysql/wordpressdb/
/var/lib/mysql/wordpressdb/
├── db.opt
├── wpos_commentmeta.frm
├── wpos_commentmeta.ibd
├── wpos_comments.frm
├── wpos_comments.ibd
├── wpos_links.frm
├── wpos_links.ibd
├── wpos_options.frm
├── wpos_options.ibd
├── wpos_postmeta.frm
├── wpos_postmeta.ibd
├── wpos_posts.frm
├── wpos_posts.ibd
├── wpos_termmeta.frm
├── wpos_termmeta.ibd
├── wpos_term_relationships.frm
├── wpos_term_relationships.ibd
├── wpos_terms.frm
├── wpos_terms.ibd
├── wpos_term_taxonomy.frm
├── wpos_term_taxonomy.ibd
├── wpos_usermeta.frm
├── wpos_usermeta.ibd
├── wpos_users.frm
└── wpos_users.ibd
Le fichier db.opt est un simple fichier texte correspondant aux préférences de langue :
# cat db.opt
default-character-set=utf8mb4
default-collation=utf8mb4_general_ci
3. Erreur 404 lors du changement de permaliens
Lorsque l’on change les règles de permaliens de la configuration par défaut :
http://www.opensharing.priv/?p=123
vers n’importe quelle autre configuration, on obtient une erreur 404 de page non trouvée.
Pour corriger ce problème, éditer la page de configuration générale de Apache :
# nano /etc/apache2/apache2.conf
<Directory /var/www/>
...
AllowOverride All
...
</Directory>
Sans cette modification, le fichier /var/www/wordpress/.htaccess sera occulté et les réécritures de liens ne fonctionneront pas.
Rmq : La modification ou la création d’un fichier .htaccess doit se faire uniquement si l’on n’a pas accès à la configuration Apache des VirtualHosts (dans le cas d’un hébergement de site où nos droits d’accès sont restreints à la racine du site par exemple), ou alors pour des tests, mais elle est à proscrire autant que faire se peu en production. Les mêmes règles définies dans un .htaccess peuvent être écrites dans la configuration d’un VirtualHost dans le Directory correspondant.
4. Restreindre l’accès à la page d’authentification par adresse IP
Si l’on veut, par exemple, que seule l’adresse IP 192.168.0.10 puisse accéder à wp-login.php, c’est à dire la page d’authentification, modifier le fichier /var/www/wordpress/.htaccess
# nano /var/www/wordpress/.htaccess
Et ajouter les lignes suivantes :
# BEGIN WordPress
...
<Files wp-login.php>
order deny,allow
allow from 192.168.0.10
deny from all
</Files>
# END WordPress
Rmq : La modification ou la création d’un fichier .htaccess doit se faire uniquement si l’on n’a pas accès à la configuration Apache des VirtualHosts (dans le cas d’un hébergement de site où nos droits d’accès sont restreints à la racine du site par exemple), ou alors pour des tests, mais elle est à proscrire autant que faire se peu en production. Les mêmes règles définies dans un .htaccess peuvent être écrites dans la configuration d’un VirtualHost dans le Directory correspondant.
5. Restreindre l’accès aux pages d’administration par adresse IP
# nano /var/www/wordpress/wp-admin/.htaccess
Order deny,allow
Allow from 192.168.0.10
Deny from all
Rmq : La modification ou la création d’un fichier .htaccess doit se faire uniquement si l’on n’a pas accès à la configuration Apache des VirtualHosts (dans le cas d’un hébergement de site où nos droits d’accès sont restreints à la racine du site par exemple), ou alors pour des tests, mais elle est à proscrire autant que faire se peu en production. Les mêmes règles définies dans un .htaccess peuvent être écrites dans la configuration d’un VirtualHost dans le Directory correspondant.
6. Modifier la taille des fichiers uploadables
Par défaut, cette taille est fixée à 8Mo.
Pour la modifier :
# nano /etc/php/7.0/apache2/php.ini
Modifier le paramètre suivant :
upload_max_filesize = 64M
La taille maximum des fichiers uploadables passe à 64Mo.
Pour la taille d’un article :
post_max_size = 0
Une taille de 0 désactive la limite de taille d’un article fixée à 8Mo par défaut.
7. Modifier la traduction de WordPress ou d’un thème particulier
Deux fichiers sont importants : un fichier .po et un fichier .mo
- Le fichier .po est la version texte de la traduction
- Le fichier .mo est la version compilée du fichier .po
Modifier le fichier .po ne suffit donc pas, il faut générer le fichier .mo à partir du fichier .po modifié
Pour cela, il faut utiliser le logiciel Poedit
Par exemple, pour modifier le fichier de traduction française de WordPress, il faut télécharger le fichier suivant :
/var/www/wordpress/wp-content/languages/fr_FR.po
Ensuite le modifier avec Poedit, puis sauvegarder sous le nom fr_FR.po (renommer l’original avant modification pour éviter le conflit d’écrasement).
Ceci générera les 2 fichiers mentionnés : fr_FR.po et fr_FR.mo
Il suffit ensuite de placer ces 2 fichiers dans :
/var/www/wordpress/wp-content/languages/
En écrasant les originaux (sauvegardés par sécurité, au préalable)
Pour modifier la traduction d’un thème, la procédure est la même, seule la localisation des fichiers .po et .mo diffère.
Toutefois, si le thème ne possède qu’un fichier .pot, il sera nécessaire de l’ouvrir en tant que fichier .pot sous Poedit puis de générer les fichiers .po et .mo
Cependant, en cas de mise à jour de WordPress ou du thème actif, les traductions seront écrasées, c’est pourquoi il faut travailler sur un thème enfant.
8. Limiter le nombre de révisions par article
Ceci permet de réduire sensiblement la taille de la base de données.
Pour cela, ajouter la ligne suivante dans le fichier /var/www/wordpress/wp-config.php
define('WP_POST_REVISIONS', 3);
Le nombre de révisions maximum passe à 3. Les nouvelles révisions remplacent les anciennes.
Il faut savoir qu’une des révisions sera la sauvegarde automatique, donc il y aura 3 révisions en cliquant sur Publier et 1 sauvegarde automatique, soit 4 révisions potentielles au total.
Les révisions et la sauvegarde automatique sont deux choses différentes. Toutefois, la sauvegarde automatique apparait sous forme d’une révision comme les autres. Désactiver les révisions ne désactive pas la sauvegarde automatique.
9. Désactiver les révisions des articles
Pour cela, ajouter la ligne suivante dans le fichier /var/www/wordpress/wp-config.php.
define('WP_POST_REVISIONS', false);
Ceci supprime totalement la possibilité de restaurer une version précédente d’un article.
Les révisions et la sauvegarde automatique sont deux choses différentes. Toutefois, la sauvegarde automatique apparait sous forme d’une révision comme les autres. Désactiver les révisions ne désactive pas la sauvegarde automatique.
10. Définir un intervalle de récupération automatique des articles
Ceci permet, à l’instar de Word ou Excel, de définir un temps au bout duquel une version de l’article en cours de rédaction est automatiquement sauvegardée.
Pour cela, ajouter la ligne suivante dans le fichier /var/www/wordpress/wp-config.php.
define('AUTOSAVE_INTERVAL', 300);
Ici 300 secondes, soit 5 minutes.
Cet intervalle est de 60 secondes par défaut.
Les révisions et la sauvegarde automatique sont deux choses différentes. Toutefois, la sauvegarde automatique apparait sous forme d’une révision comme les autres. Désactiver les révisions ne désactive pas la sauvegarde automatique.
11. Désactiver la fonction de récupération automatique des articles
Le plus simple est de définir un intervalle important, par exemple 86400 secondes, soit un jour.
Pour cela, ajouter la ligne suivante dans le fichier /var/www/wordpress/wp-config.php.
define('AUTOSAVE_INTERVAL', 86400);
12. Vider la base de données des différentes révisions d’articles
Vérifier le nombre de révisions occupant la base de données :
mysql> SELECT * FROM wpos_posts WHERE post_type='revision';
(le suffixe dépend de la base de données)
Pour supprimer les différentes révisions :
mysql> DELETE FROM wpos_posts WHERE post_type='revision';
13. Effectuer une sauvegarde manuelle complète
# mkdir /home/adminsys/backup/4.9.6/ # cd /home/adminsys/backup/4.9.6/ # tar -czvf backup-wordpress-20170531.tar.gz -C /var/www/ wordpress/ # mysqldump --user=wpadmin --password=wpadminpw --databases wordpressdb > wordpress-20180531.sql
14. Effectuer une restauration manuelle complète
# cd /home/adminsys/backup/4.9.6/ # tar -xzvf backup-wordpress-20180531.tar.gz -C /var/www/ # mysql --user=wpadmin --password=wpadminpw wordpressdb < wordpress-20180531.sql
15. Cas d’une migration de site
Dans le cas d’une migration de domaine ou de serveur, si l’URL change alors il faut modifier toutes les occurrences relatives à l’ancien URL dans la base de données. Pour cela utiliser le programme Search-Replace-DB.
Très simple d’utilisation, il suffit de le dézipper à la racine du site.
# unzip Search-Replace-DB-master.zip -d /var/www/wordpress/
Archive: Search-Replace-DB-master.zip
c8dfccb7bf179cb7063a0622cc2a592141411ff3
creating: /var/www/wordpress/Search-Replace-DB-master/
inflating: /var/www/wordpress/Search-Replace-DB-master/README.md
inflating: /var/www/wordpress/Search-Replace-DB-master/composer.json
inflating: /var/www/wordpress/Search-Replace-DB-master/index.php
inflating: /var/www/wordpress/Search-Replace-DB-master/package.json
creating: /var/www/wordpress/Search-Replace-DB-master/srdb-tests/
inflating: /var/www/wordpress/Search-Replace-DB-master/srdb-tests/DataSet.xml
inflating: /var/www/wordpress/Search-Replace-DB-master/srdb-tests/DataSetGenerator.php
inflating: /var/www/wordpress/Search-Replace-DB-master/srdb-tests/SrdbTest.php
inflating: /var/www/wordpress/Search-Replace-DB-master/srdb-tests/charset-test.php
inflating: /var/www/wordpress/Search-Replace-DB-master/srdb-tests/db.sql
inflating: /var/www/wordpress/Search-Replace-DB-master/srdb.class.php
inflating: /var/www/wordpress/Search-Replace-DB-master/srdb.cli.php
Ensuite il suffit d’ouvrir le navigateur en précisant le dossier en question :
http://wp-test.opensharing.priv/Search-Replace-DB-master/
Et de spécifier le remplacement à effectuer :
Il faut enfin supprimer le dossier copié précédemment :
# rm -rf /var/www/wordpress/Search-Replace-DB-master/
16. Créer un thème enfant
Nous prendrons ci-dessous l’exemple arbitraire du thème OceanWP mais la procédure est généralement identique quel que soit le thème.
Créer le dossier du thème enfant :
# mkdir /var/www/wordpress/wp-content/themes/oceanwp-child/
Déposer dans ce dossier 3 fichiers :
- style.css : contenant la mise en forme CSS propre au thème enfant
- functions.php : contenant les fonctions propres au thème enfant (les autres fonctions sont chargées depuis le thème parent)
- screenshot.png : photo du thème enfant de taille 1200×900 ou de tout ratio 1.3333
Contenu minimal du fichier style.css :
/* Theme Name: OceanWP Child Theme URI: https://oceanwp.org/ Description: OceanWP WordPress theme example child theme. Author: Nick Author URI: https://oceanwp.org/ Template: oceanwp Version: 1.0 */
Contenu minimal du fichier functions.php générique :
<?php add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' ); function theme_enqueue_styles() { wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' ); } ?>
Rmq : Dans le cas particulier du thème OceanWP, il existe même un dépôt GitHub où l’on peut trouver ces fichiers adaptés à ce thème.
Contenu minimal du fichier functions.php adapté spécifiquement :
<?php function oceanwp_child_enqueue_parent_style() { $theme = wp_get_theme( 'OceanWP' ); $version = $theme->get( 'Version' ); wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/style.css', array( 'oceanwp-style' ), $version ); } add_action( 'wp_enqueue_scripts', 'oceanwp_child_enqueue_parent_style' ); ?>
17. Interdire le parcours et listing de l’arborescence du site
Modifier le fichier .htaccess situé à la racine du site et ajouter la ligne suivante en fin de fichier :
# nano /var/www/wordpress/.htaccess
# END WordPress
Options All -Indexes
Rmq : La modification ou la création d’un fichier .htaccess doit se faire uniquement si l’on n’a pas accès à la configuration Apache des VirtualHosts (dans le cas d’un hébergement de site où nos droits d’accès sont restreints à la racine du site par exemple), ou alors pour des tests, mais elle est à proscrire autant que faire se peu en production. Les mêmes règles définies dans un .htaccess peuvent être écrites dans la configuration d’un VirtualHost dans le Directory correspondant.
18. Tester la vulnérabilité du site avec WPScan
La procédure d’installation et d’utilisation de WPScan se trouve sur son site officiel ou son dépôt GitHub.
ex avec Docker :
$ docker run -it --rm -v ~/wordlists:/wordlists wpscanteam/wpscan --url http://opensharing.priv --wordlist /wordlists/crackstation.txt --username john.doe --logs /wordlists/logs.txt
Ci-dessus, on utilise un fichier crackstation.txt comportant une liste de mots de passe à tester sur le site en force brute.
Le fichier de logs logs.txt doit exister ou il sera créé au lancement de la commande.
$ docker run -it --rm wpscanteam/wpscan --url http://opensharing.fr --enumerate u --enumerate vt --enumerate vp
Ci-dessus, on teste la vulnérabilité du site, des noms d’utilisateurs, des thèmes et des plugins installés.
Références
- WordPress.org – Site Officiel
- WordPress.com – Site Officiel
- WordPress Versions
- WordPress 0.7 – Annonce officielle
- WordPress Archives
- Traduction WordPress : Vous faites fausse route !
- Subtle Patterns : Arrières-plans utilisables sous WordPress
- Piresponsive – Tester la responsivité d’un site
- WordPress.org – Code Reference
- WordPress.org – Codex WordPress
- WP Formation : Créer un thème enfant pour WordPress
- Search Replace DB
- Poedit – Gettext Translations Editor