---
categories: Wordpress saas web
title: Howto Wordpress
...

# W3 Total Cache

W3 Total Cache améliore les performances d'un « site/blog » propulsé par Wordpress ainsi que la rapidité du chargement des pages pour une meilleure expérience utilisateur et un meilleur référencement !

Pour cela W3 Total Cache met en cache différents éléments : renforcement du cache navigateur, cache des pages, des objets et des requêtes SQL. Il propose aussi différentes fonctions tel que le html/css/js minify et la gestion de CDN.

## Installation

### Prérequis

* PHP 5.6 >=
* MySQL 5.6 >=
* Apache avec module rewrite

### Procédure

* Télécharger l'archive du plugin sur le site de [Wordpress](http://wordpress.org/extend/plugins/w3-total-cache/) et la décompresser dans wp-content/plugins. (Ou bien installer le plugin depuis Wordpress) ;
* Activer le plugins dans la liste des extensions Wordpress ;
* Passer à la configuration.

## Configuration

La configuration se passe dans le tableau de bord de Worpdress, dans l'onglet « Performance ».
Cliquer sur le bouton « Compatiblity Check », pour vérifier que votre serveur dispose de tous les modules nécessaire.


# Mise à jour Wordpress par l'interface web via ssh

Tutoriel détaillé : http://kbeezie.com/secure-wordpress-ssh2/

**Wordpress 4.3 et 4.8**, la mise à jour via ssh est cassée et il faudra appliquer ce fix : <https://www.lekernelpanique.fr/2015/09/08/wordpress-4-3-casse-la-mise-a-jour-via-sshsftp/>

1. Vérifier que le module PHP `ssh2` est installé.
1. Activer `allow_url_fopen` dans la configuration du vhost.
1. Assurez-vous que l'option `define('FS_METHOD','direct')` n'est pas définie, on peut la forcer à ssh2 si nécessaire.
1. Vérifier la correspondance des droits avec le module ITK d'Apache (directive `AssignUserID`) et l'accès à la clé privé SSH.

~~~
# vhost=siteweb
# install -d -o www-${vhost} -g $vhost -m 750 /home/${vhost}/sshkeys
# ssh-keygen -f /home/${vhost}/sshkeys/wordpress
# chown www-${vhost}: /home/${vhost}/sshkeys/wordpress*
# cat /home/${vhost}/sshkeys/wordpress.pub >> /home/${vhost}/.ssh/authorized_keys
# sudo -u www-${vhost} ssh -i /home/${vhost}/sshkeys/wordpress ${vhost}@127.0.0.1
~~~

Modifier le fichier `wp-config.php` en conséquence:

~~~
define( 'FS_METHOD', 'ssh2' );
define( 'FTP_USER', '$vhost' );
define( 'FTP_HOST', '127.0.0.1' );
define( 'FTP_PUBKEY', '/home/$vhost/sshkeys/wordpress.pub' );
define( 'FTP_PRIKEY', '/home/$vhost/sshkeys/wordpress' );
~~~

Il reste plus qu'a se rendre sur le backoffice du site à la page qui liste les modules et en mettre un à jour pour tester.

# Mise à jour Wordpress [plugins] depuis l'interface web (éviter)

Revoir les droits du groupe pour permettre l'écriture ($HOME/www = où le wp est installé) :

~~~
$ chmod g+w $HOME/www/ $HOME/www/wp-includes/version.php
$ chmod g+w -R $HOME/www/wp-admin/includes/ $HOME/www/wp-content/ $HOME/www/wp-content/upgrade/ $HOME/www/wp-content/languages/

~~~
Si vous avez des retours de type : 'Operation not permitted', il y a de bonne chance que le propriétaire du fichier soit déjà l'utilisateur utilisé par l'instance du serveur web (et donc les droits sont déjà suffisant).

## Définir les droits des fichiers écrit par Wordpress

Wordpress surcharge l'umask définie par Apache/PHP et écrit par défaut les fichiers et dossiers en 750.

Il faut rajouter ces 2 lignes dans wp-config.php pour avoir des droits corrects :

~~~
define( 'FS_CHMOD_DIR', ( 0770 & ~ umask() ) );
define( 'FS_CHMOD_FILE', ( 0660 & ~ umask() ) );
~~~

## Attaque sur xmlrpc.php

Sur les Wordpress pas à jour, l'API xmlrpc.php est sensible à une attaque par rebond, un attaquant réalise plein de requêtes sur xmlrpc.php et votre serveur fait des requêtes vers la/les cibles de l'attaquant.

S'il ne vous est pas possible de mettre à jour Wordpress, une solution est de bloquer les requêtes vers xmlrpc.php dans Apache :

~~~
<Files "xmlrpc.php">
Deny from all
</Files>
~~~

# Maintenance

## Vérifier la liste des plugins installés sur Wordpress

~~~{ .sql }
> SELECT * FROM wp_options WHERE option_name = 'active_plugins';
~~~

# wp-cli

Permet d'administrer une instance Wordpress à partir de la ligne de commande.
[<http://wp-cli.org/commands/>]

## Installation

~~~{.bash}
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
~~~

## core

Vérifier que le répertoire en question correspond bien à un wordpress :

~~~
php wp-cli.phar core is-installed --path=$HOME/www
~~~

### Installation de Wordpress

Configuration des différentes directives à compléter (pour la base de donnée) :

~~~
php wp-cli.phar core config --dbname=nombase --dbuser=nomutilisateur --dbpass=motdepasse \
--dbhost=hostnamedb --path=$HOME/www

~~~
Procéder à l'installation :

~~~
php wp-cli.phar core install --url="ServerName" --title="TITRE_WP" --admin_user="admin" --admin_password="motdepasseadmin" \
--admin_email="emailadmin" --skip-email --path="$HOME/www"
~~~

### Mise à jour

#### Avec wp-cli

Se placer dans le répertoire où est installé wp :

~~~
$ cd $HOME/www
~~~

Forcer le téléchargement de la dernière version (US) - non recommandé:

~~~
$ php $HOME/wp-cli/wp-cli.phar core download --force
~~~

Vérifier si maj disponible :

~~~
$ php $HOME/wp-cli/wp-cli.phar core check-update
+---------+-------------+-------------------------------------------------------------+
| version | update_type | package_url                                                 |
+---------+-------------+-------------------------------------------------------------+
| 4.6.1   | major       | <https://downloads.wordpress.org/release/wordpress-4.6.1.zip> |
+---------+-------------+-------------------------------------------------------------+
~~~

Mettre à jour wordpress et la bd

~~~
$ php $HOME/wp-cli/wp-cli.phar core update
Updating to version 4.6.1 (en_US)...
Downloading update from <https://downloads.wordpress.org/release/wordpress-4.6.1-no-content.zip...>
Unpacking the update...
Cleaning up files...
No files found that need cleaned up.
Success: WordPress updated successfully.
$ php $HOME/wp-cli/wp-cli.phar core update-db
Success: WordPress database upgraded successfully from db version 36686 to 37965.
~~~

#### Mise à jour automatique

Par défaut, le core de WordPress se met à jour automatiquement pour les versions mineures, cf <https://codex.wordpress.org/Configuring_Automatic_Background_Updates>

### Redirections

Lister les redirections déjà présentes sur le WP :

~~~{.bash}
$ php $HOME/wp-cli/wp-cli.phar rewrite list --format=csv
~~~

Lister selon url donné (ex: SERVERNAME/fr_FR) :

~~~{.bash}
$ php $HOME/wp-cli/wp-cli.phar --url=SERVERNAME rewrite list --format=csv --match=fr_FR
~~~

### Utilisateurs

Créer un utilisateur admin :

~~~
$ php $HOME/wp-cli/wp-cli.phar user create admintest john@example.com --role=administrator
Success: Created user 3.
Password: XXXXXXX
~~~

Si temporaire, ne pas oublier de le supprimer :

~~~
$ php $HOME/wp-cli/wp-cli.phar user list
+----+------------+---------------+----------------------+----------------------+---------------+
| ID | user_login | display_name  | user_email           | user_registered      | roles         |
+----+------------+---------------+----------------------+----------------------+---------------+
| X  | admintest  | admintest     | johndoe@example.com  | 2016-10-17 17:40:26  | administrator |

$ php $HOME/wp-cli/wp-cli.phar user delete X
~~~


# Sécurité

## WPScan

WPSscan (https://wpscan.org/) est un outil de scan de vulnérabilités en boite noire dédié à WordPress. Il va détecter la version de WordPress, lister d'éventuelles vulénrabilités connues pour cette version, répertorier les thèmes et plugins utilisés avec leur failles et pointer des défauts de configuration de l'installation.

Pour l'installer, vous pouvez suivre les instructions de [la documentation](https://github.com/wpscanteam/wpscan#install)

### Utilisation

#### Mise à jour
Avant la première utilisation, et de manière régulière, il faut mettre à jour WPScan, cela lui permet de récupérer la liste des dernière vulnérabiliés. Vous pouvez le faire avec la commande suivante :

~~~
ruby wpscan.rb --update
~~~

*Note* : Si votre base de donnée locale des vulnérabilités est trop ancienne, le script vous proposera automatiquement de faire la mise à jour.

#### Scan d'un site

L'opération est simple, il suffit juste de donner l'adresse du site à WPScan. Vous optiendrez alors un compte rendu complet de la situation.

~~~
ruby wpscan.rb --url example.net
~~~

## Bloquer l'exécution de PHP dans wp-contents/uploads

Avec Apache :

~~~
<Directory /home/SITE/www/wp-content/uploads/>
    <FilesMatch "\.php$">
    Order allow,deny
    Deny from all
    </FilesMatch>
</Directory>
~~~

# Erreurs

## Problème de "Live preview" sur les thèmes

S’il y a un problème pour generer un "live preview" d'un thèmes, ou si on a une erreur php de ce type dans les logs :

PHP Fatal error:  Call to undefined function submit_button() in $HOME/www/wp-content/plugins/ssh-sftp-updater-support/sftp.php on line 249

Il faut ajouter cette option dans le fichier wp-config.php :

~~~
define( 'FS_METHOD', 'direct' );
~~~

Il faut placer cette option avant toutes les autres, en début de fichier.

> **Note** : Attention, ne pas faire ceci si apache tourne avec un autre utilisateur (tel que le module ITK).

## Erreur lors de mise a jour : Impossible de localiser le dossier racine de WordPress (wp-content)

Il faut ajouter ce hack à la fin du fichier *wp-config.php* :

~~~
if(is_admin()) {
add_filter('filesystem_method', create_function('$a', 'return "direct";' ));
define( 'FS_CHMOD_DIR', 0751 );
}
~~~

> **Note** : Attention, ne pas faire ceci si apache tourne avec un autre utilisateur (tel que le module ITK).

## Erreur lors de la publication d'une page

Si vous rencontrez l'erreur 404 suivante dans les logs lors de la publication d'une page :

~~~
POST /wp-json/wp/v2/pages/xx?_locale=user HTTP/1.1" 404
~~~

Cela vient probablement des permaliens. Il suffit de les mettre à jour dans la partie Réglages > permaliens du panneau d'administration en cliquant sur "Enregistrer les modifications".


# Divers

## Multisite

<https://codex.wordpress.org/Nginx#WordPress_Multisite_subdomains_rules>


