Astuces WordPress : securite, durcissement et SSL offload (logo WordPress, cadenas, bouclier, reverse proxy)

Voici une sélection d’astuces pratiques pour WordPress, revues et mises à jour pour les versions récentes (WordPress 6.x). Sauf indication contraire, le code PHP se place dans le fichier functions.php de votre thème — idéalement un thème enfant, afin de ne pas perdre vos modifications à chaque mise à jour du thème.

Cacher la barre d’administration

La barre d’administration de WordPress s’affiche en haut du site lorsqu’on est connecté. Si elle ne vous sert pas, masquez-la proprement avec le filtre dédié :

add_filter('show_admin_bar', '__return_false');

Astuce : chaque utilisateur peut aussi la désactiver pour lui-même depuis Utilisateurs → Profil.

Alléger l’en-tête HTML généré par WordPress

Par défaut, WordPress ajoute dans l’en-tête de vos pages plusieurs balises souvent inutiles (numéro de version, liens oEmbed, lien de l’API REST, scripts d’emojis…). On peut les retirer pour un en-tête plus léger :

add_action('init', function () {
    // Numéro de version de WordPress
    remove_action('wp_head', 'wp_generator');
    // Lien "shortlink"
    remove_action('wp_head', 'wp_shortlink_wp_head');
    // Liens de découverte oEmbed
    remove_action('wp_head', 'wp_oembed_add_discovery_links');
    // Lien vers l'API REST (balise rel api.w.org)
    remove_action('wp_head', 'rest_output_link_wp_head');
    // Scripts et styles des emojis
    remove_action('wp_head', 'print_emoji_detection_script', 7);
    remove_action('wp_print_styles', 'print_emoji_styles');
});

À noter : les anciennes lignes pour retirer rsd_link (RSD) et wlwmanifest_link (Windows Live Writer) ne sont plus nécessaires — ces balises ont été supprimées du cœur de WordPress à partir de la version 6.7 (octobre 2024).

Pour supprimer les liens de flux RSS automatiques, l’ancienne fonction automatic_feed_links(false) est dépréciée depuis WordPress 3.0. On utilise désormais :

add_action('after_setup_theme', function () {
    remove_theme_support('automatic-feed-links');
});

Astuces pour le fichier wp-config.php

Maîtriser les révisions d’articles
Plutôt que de désactiver complètement l’historique, il est souvent préférable d’en limiter le nombre :

// Conserver au maximum 5 révisions par article
define('WP_POST_REVISIONS', 5);
// ... ou tout désactiver : define('WP_POST_REVISIONS', false);

Régler l’autosauvegarde et la corbeille

// Intervalle d'enregistrement automatique, en secondes
define('AUTOSAVE_INTERVAL', 300);
// Vider automatiquement la corbeille au bout de 7 jours
define('EMPTY_TRASH_DAYS', 7);

Activer l’outil de réparation de la base
Une fois activé, il est accessible à l’adresse /wp-admin/maint/repair.php (pensez à le redésactiver ensuite) :

define('WP_ALLOW_REPAIR', true);

Forcer l’URL du site
Pratique pour réparer une mauvaise URL saisie dans Réglages → Général (utilisez bien https) :

define('WP_HOME', 'https://www.mon-site.fr');
define('WP_SITEURL', 'https://www.mon-site.fr');

Mises à jour sans identifiants FTP
Si WordPress réclame des identifiants FTP à chaque mise à jour, forcez la méthode directe :

define('FS_METHOD', 'direct');

Durcir la sécurité
Quelques constantes de durcissement : désactiver l’éditeur de fichiers de thèmes/extensions intégré à l’admin (souvent exploité après un piratage), forcer le HTTPS sur l’administration et la page de connexion, et activer les mises à jour automatiques mineures (correctifs de sécurité) :

/* Durcissement WordPress */
define('DISALLOW_FILE_EDIT', true);
define('FORCE_SSL_ADMIN', true);
define('WP_AUTO_UPDATE_CORE', 'minor');

Note : derrière un reverse proxy en SSL offload, FORCE_SSL_ADMIN suppose que WordPress détecte bien le HTTPS (voir la section X-Forwarded-Proto plus bas), sinon vous risquez une boucle de redirection sur l’admin.

Migrer le site vers un nouveau domaine

L’ancienne méthode par requêtes SQL UPDATE … REPLACE est aujourd’hui déconseillée : elle casse les données sérialisées (réglages de thème, widgets, options d’extensions), car la longueur des chaînes n’est pas recalculée. La bonne méthode passe par WP-CLI, qui gère correctement la sérialisation :

# Toujours sauvegarder la base AVANT toute opération
wp db export sauvegarde-avant-migration.sql
# Simulation (dry-run) pour verifier l'ampleur des remplacements
wp search-replace 'https://ancien-domaine.fr' 'https://nouveau-domaine.fr' --all-tables --dry-run
# Si le rapport est correct, on relance pour de vrai
wp search-replace 'https://ancien-domaine.fr' 'https://nouveau-domaine.fr' --all-tables
# Purger le cache d'objets si present (Redis/Memcached)
wp cache flush

Sans accès à WP-CLI, l’extension Better Search Replace fait la même chose en toute sécurité depuis l’admin.

Désactiver XML-RPC

Le fichier xmlrpc.php (qui gérait notamment les pingbacks et l’ancien Windows Live Writer) est aujourd’hui une cible fréquente d’attaques par force brute. Si vous ne l’utilisez pas, désactivez-le :

add_filter('xmlrpc_enabled', '__return_false');

WordPress derrière un reverse proxy : SSL offload et X-Forwarded-Proto

Lorsqu’un reverse proxy ou un load-balancer (HAProxy, Nginx, Traefik…) assure le SSL offload — il termine le HTTPS et transmet la requête en HTTP clair au serveur WordPress — WordPress ne « voit » que du trafic HTTP. Conséquences classiques : URLs générées en http://, contenus mixtes (mixed content) bloqués par le navigateur, et parfois des boucles de redirection dans l’administration.

La parade : le reverse proxy transmet le protocole d’origine via l’en-tête X-Forwarded-Proto, et on indique à WordPress de le prendre en compte. À placer en haut de wp-config.php, avant la ligne require_once ABSPATH . ‘wp-settings.php’ :

// Tenir compte du protocole réel transmis par le reverse proxy (SSL offload)
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

Encore faut-il que le reverse proxy envoie bien cet en-tête. Exemples côté proxy :

# Nginx (dans le bloc qui transmet vers le backend WordPress)
proxy_set_header X-Forwarded-Proto $scheme;
# HAProxy (frontend HTTPS, avant de router vers le backend en clair)
http-request set-header X-Forwarded-Proto https