Maintenance pour WordPress : opération nettoyage en profondeur

Mis à jour le :

Maintenir à jour un site WordPress consiste en une série d’opérations techniques allant de la simple mise à jour d’extension ou de thème à un nettoyage en profondeur de votre base de données.

En tant que spécialiste de la maintenance de site sous WordPress, je me suis donné pour challenge d’optimiser au mieux WP channel, qui affichait alors un historique de bientôt 10 ans d’existence.

Mener à bien une cure de jouvence est une tâche longue et ardue. Prévoyez de sauvegarder autant de fois que nécessaire votre site avant d’opérer des nettoyages irréversibles. Notez que cet article ne passe pas en revue toutes les actions propre à une maintenance régulière d’un site WordPress mais s’attarde sur le nettoyage de sites avec un passif de plusieurs années. Les recettes ont directement été appliquées sur ce blog.

La base de données

Une base de données stocke l’ensemble des contenus et réglages de votre site. Elle peut rapidement s’engorger de données obsolètes qui parasitent l’ensemble. Un exemple concret concerne l’installation d’extensions qui peuvent créer des tables supplémentaires. Le problème est qu’une fois désinstallé depuis votre back-office, les tables sont rarement supprimées et restent présentes.

Avant d’aller plus loin, vous devez impérativement sauvegarder votre base de données et vous assurer que celle-ci est parfaitement fonctionnelle. Vous devez également maitriser un outil comme phpMyAdmin ou Adminer.

Supprimer les tables inutiles de votre base de données

Cette opération est loin d’être simple car elle nécessite tout d’abord d’identifier les tables à supprimer. Il faut donc avoir une certaine expérience pour savoir à quelles extensions correspondent les noms des tables. Certaines sont plus faciles que d’autres à identifier.

Un site WordPress simple (hors multisite) ne compte que 12 tables, toutes précédées du préfixe défini par la variable $table_prefix de votre fichier wp-config.php (wp_ par défaut) : commentmeta, comments, links, options, postmeta, posts, term_relationships, term_taxonomy, termmeta, terms, usermeta et users. Les autres tables qui portent ce préfixe ont été créées par une extension ou par un thème. Ne touchez pas à celles qui portent un autre préfixe : elles peuvent appartenir à un autre site installé dans la même base.

À partir de là, vous pouvez sélectionner puis supprimer les tables n’ayant pas fait l’objet d’une suppression suite à la désinstallation d’une extension. Exportez-les d’abord : vous pourrez les réimporter en cas d’erreur.

Pour ma part, j’ai réussi à économiser 70 Mo de données. Pas mal non ?

Modifier l’encodage de caractères en utf8mb4

Depuis WordPress 4.2, sorti en 2015, la base de données utilise l’encodage de caractères utf8mb4 à la place d’utf8 : il accepte tous les caractères Unicode, émojis compris. Lors de la mise à jour vers cette version, WordPress a tenté une seule fois de convertir ses propres tables, et seulement si le serveur de base de données gérait déjà utf8mb4 (MySQL 5.5.3 ou plus récent) : il n’a converti que celles qui étaient en utf8. Il ne convertit ni les tables en latin1 ni celles créées par des extensions.

Dans votre fichier wp-config.php, lequel, rappelons-le, lie votre installation à votre base, la constante DB_CHARSET indique peut-être encore utf8 : ce n’est pas un problème, WordPress utilise de toute façon utf8mb4 pour dialoguer avec la base. Pour connaître l’encodage et l’interclassement réellement utilisés, ouvrez Outils > Santé du site, onglet Informations, section Base de données : ils figurent sur les lignes « Jeu de caractères de la base de données » et « Classement de base de données ».

Écran Outils > Santé du site de WordPress, onglet Informations, défilé jusqu’aux dernières sections : Traitement des médias et Serveur repliés, Base de données déplié avec les lignes Extension de la base de données (mysqli), Version du serveur (10.11.14-MariaDB-0ubuntu0.24.04.1), Version du client (mysqlnd 8.4.21), Identifiant MySQL (wordpress), Hôte de base de données (localhost), Nom de la base de données (wordpress), Préfixe de table (wp_), Jeu de caractères de la base de données (utf8mb4), Classement de base de données (utf8mb4_unicode_520_ci), Taille maximale autorisée du paquet (16777216) et Nombre maximal de connexions (151), puis Constantes WordPress et Droits des fichiers système repliés ; le menu latéral montre Outils ouvert sur Santé du site.
Le jeu de caractères et l’interclassement utilisés par WordPress, dans l’outil Santé du site

Dans phpMyAdmin, la liste des tables de votre base indique ensuite l’interclassement de chacune, dans la colonne Interclassement : les tables en latin1 (latin1_swedish_ci) ou en utf8 (utf8_general_ci, utf8mb3_general_ci) n’ont pas été converties. Après une sauvegarde, convertissez-les une à une depuis l’onglet SQL, en remplaçant le nom de la table dans la requête suivante et en reprenant l’interclassement indiqué par WordPress :

ALTER TABLE `wp_nom_de_la_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

L’onglet Opérations de la base, section Interclassement, convertit toutes les tables d’un coup si vous cochez « Changer les interclassements de toutes les tables » puis « Changer les interclassements de toutes les colonnes de toutes les tables ». Sans cette seconde case, seul l’interclassement par défaut des tables change, pas celui des colonnes qui contiennent vos données.

Prudence avec les tables en latin1 : sur un site ancien, elles contiennent souvent du texte déjà encodé en UTF-8, que leur conversion transforme en suites de caractères illisibles (« Café » au lieu de « Café »). Faites un essai sur une copie de votre base et contrôlez vos contenus avant de convertir celle de votre site.

Effacer les trackbacks / pingbacks

Les rétroliens ou trackbacks sont des liens retours générés automatiquement dans les commentaires d’un article lorsqu’un site tiers émet un lien vers votre billet. Cette technique de maillage externe très ancienne n’est guère plus utilisée depuis de nombreuses années.

Fort de plus de 10 000 commentaires sur ce blog, j’ai donc lancé une commande SQL afin de les supprimer en totalité. Ils n’apportent rien d’intéressant pour le visiteur.

Pour comprendre la nuance entre les trackbacks et les pingbacks, consultez la documentation officielle de WordPress sur les rétroliens et les pings (en anglais).

Pour prévenir la création de tels liens, n’oubliez pas de décocher l’option « Autoriser les notifications de lien en provenance d’autres blogs (pings et rétroliens) sur les nouvelles publications » dans Réglages > Commentaires. Comme son nom l’indique, elle ne s’applique qu’aux nouvelles publications.

Écran Réglages > Commentaires de WordPress (titre Réglages des commentaires) : dans la section Réglages de publication par défaut, « Tenter de notifier les sites liés depuis la publication » est cochée, « Autoriser les notifications de lien en provenance d’autres blogs (pings et rétroliens) sur les nouvelles publications » décochée et « Autoriser les commentaires sur les nouvelles publications » cochée, avec la mention « Des publications individuelles peuvent surcharger ces réglages. Les modifications ne seront ici appliquées qu’aux nouvelles publications. » ; suivent les sections Autres réglages des commentaires et Pagination des commentaires ; le menu latéral montre Réglages ouvert sur Commentaires.
L’option qui autorise les pings et rétroliens sur les nouvelles publications, à décocher

Voici les requêtes à exécuter dans l’onglet SQL de phpMyAdmin, en remplaçant wp_ par le préfixe de vos tables. Dans l’ordre, elles conservent les éventuelles réponses à un rétrolien en les remontant d’un niveau, suppriment les métadonnées puis les rétroliens et pings eux-mêmes, recalculent le nombre de commentaires de chaque publication et ferment les pings sur vos contenus existants.

UPDATE `wp_comments` AS c INNER JOIN `wp_comments` AS p ON c.`comment_parent` = p.`comment_ID` SET c.`comment_parent` = p.`comment_parent` WHERE p.`comment_type` IN ('pingback', 'trackback');
DELETE FROM `wp_commentmeta` WHERE `comment_id` IN (SELECT `comment_ID` FROM `wp_comments` WHERE `comment_type` IN ('pingback', 'trackback'));
DELETE FROM `wp_comments` WHERE `comment_type` IN ('pingback', 'trackback');
UPDATE `wp_posts` SET `comment_count` = (SELECT COUNT(*) FROM `wp_comments` WHERE `comment_post_ID` = `wp_posts`.`ID` AND `comment_approved` = '1' AND `comment_type` <> 'note');
UPDATE `wp_posts` SET `ping_status` = 'closed' WHERE `ping_status` = 'open';

Supprimer les liens externes de vos commentaires

Le champ Site Web présent dans le formulaire de dépôt de commentaire permet de déposer un lien externe. Bien souvent, l’auteur du commentaire indique l’URL de son site Web. Cette fonctionnalité est largement utilisée pour générer du lien retour à moindre coût et sujet au spam. Elle n’apporte là encore pas grand chose pour le visiteur et nuit à votre référencement malgré l’ajout d’une balise nofollow.

J’ai donc pris la décision de les supprimer en totalité via cette commande SQL.

UPDATE `wp_comments` SET `comment_author_url` = '' WHERE `comment_author_url` <> '';

Il vous faudra également retirer le champ Site web du formulaire de commentaire afin de prévenir tout nouvel ajout de lien externe. Inutile de modifier votre thème : le code suivant, à placer dans une extension de fonctions globales ou dans le fichier functions.php de votre thème enfant, retire ce champ, y compris avec un thème à blocs, et ignore l’adresse que des robots enverraient malgré tout au script de traitement des commentaires.

/**
 * Remove the Website field from the comment form.
 *
 * @param array $fields Default comment form fields.
 * @return array
 */
function wpc_remove_comment_url_field( $fields ) {
	unset( $fields['url'] );

	return $fields;
}
add_filter( 'comment_form_default_fields', 'wpc_remove_comment_url_field' );

/**
 * Ignore any website address sent with a new comment.
 *
 * @param array $commentdata Comment data.
 * @return array
 */
function wpc_strip_comment_author_url( $commentdata ) {
	$commentdata['comment_author_url'] = '';

	return $commentdata;
}
add_filter( 'preprocess_comment', 'wpc_strip_comment_author_url' );

Supprimer les champs personnalisés inutiles

Les champs personnalisés ou custom fields sont largement utilisés par WordPress afin de stocker des informations complémentaires au sein d’un contenu notamment. Les développeurs ont recours à l’extension Advanced Custom Fields pour générer facilement des champs personnalisés dotés d’une interface graphique. Comme toujours, un changement de thème ou la suppression d’une extension n’inclut pas le retrait des données obsolètes en base. À moins que vous ne souhaitiez les conserver pour plus tard, il vaut mieux les retirer.

L’extension Delete Custom Fields, que je recommandais ici, a été fermée sur wordpress.org en avril 2024 pour un problème de sécurité : ne l’utilisez plus.

Delete Custom Fields

Une extension d’aide à la suppression de champs personnalisés.

Taille du fichier : 19 Ko

Passez plutôt par des requêtes SQL. La première ci-dessous liste les clés de champs personnalisés de vos contenus, de la plus utilisée à la moins utilisée ; la seconde supprime toutes les valeurs d’une clé, à remplacer par celle que vous avez identifiée comme obsolète :

SELECT `meta_key`, COUNT(*) AS `total` FROM `wp_postmeta` GROUP BY `meta_key` ORDER BY `total` DESC;
DELETE FROM `wp_postmeta` WHERE `meta_key` = 'nom_du_champ';

Les clés qui commencent par un tiret bas, comme _thumbnail_id (image mise en avant) ou _wp_page_template (modèle de page), sont souvent utilisées par WordPress lui-même ou par vos extensions actives : ne supprimez que celles dont vous connaissez l’origine.

Nettoyer les données orphelines, dupliquées et inutiles

Pour cette dernière opération, nous allons pouvoir automatiser le processus à l’aide de l’extension WP-Sweep. Facile d’utilisation et particulièrement efficace, elle vous mâche le travail depuis Outils > WP-Sweep : révisions, brouillons automatiques, commentaires indésirables, métadonnées orphelines ou dupliquées, transients… Elle passe autant que possible par les fonctions de suppression de WordPress plutôt que par des requêtes SQL directes, afin que les autres extensions soient prévenues de chaque suppression.

WP-Sweep

Une extension couteau-suisse pour nettoyer votre base de données WordPress.

Taille du fichier : 15 Ko

À utiliser sans modération avec une sauvegarde bien entendu !

Terminons en ajoutant qu’il vous faut surveiller les tables suspectes : j’entends par là celles qui sont anormalement lourdes en poids ou qui contiennent des centaines de milliers de lignes. Il est toujours bon d’identifier les causes à l’origine de ce phénomène afin de mener là encore de nouvelles optimisations.

Vérifier la présence des index et des clés primaires

Si vous rencontrez des soucis de performances sur MySQL, il peut être bénéfique de vérifier si les clés primaires ainsi que les index sont bien présents pour les tables concernées. Pour ce faire, il vous faudra passer par phpMyAdmin et comparer votre installation à une installation neuve de WordPress. Pensez également à installer de zéro les extensions que vous utilisez car certaines créent des tables additionnelles.

C’est une opération longue et fastidieuse mais utile si vous cherchez en vain la cause d’une saturation du serveur de base de données… pour en avoir vécu l’expérience récemment c’est quelque chose à laquelle on ne pense guère.

Les fichiers

Le fichier .htaccess

Un fichier .htaccess est un fichier masqué de configuration propre à Apache pour un répertoire donné. Généralement, il est situé à la racine Web de votre espace et vous permet, entre autres, de gérer :

  • Vos règles de réécritures pour disposer d’URLS seo-friendly ;
  • Vos redirections 301 ;
  • Vos optimisations de cache ;
  • Votre politique de sécurité (Content Security Policy) ;

Au fil du temps, il n’est pas rare de voir s’accumuler des lignes de code obsolètes qu’il conviendra de retirer avec précaution. Laissez en revanche intactes les lignes situées entre # BEGIN WordPress et # END WordPress : WordPress les réécrit lui-même, par exemple à l’affichage de la page Réglages > Permaliens, et toute modification à cet endroit serait perdue.

Le fichier wp-config.php

Le fameux fichier wp-config.php que nous créons tous lors de l’installation de WordPress ne fait pas que relier votre installation à votre base de données MySQL ou MariaDB.

Vous pouvez y injecter des paramètres avancés comme :

Là encore, il est possible de supprimer certaines lignes obsolètes mais surtout d’améliorer la fiabilité de votre site en y ajoutant celles mentionnées plus haut dans la liste. Pensez également à consolider la force du mot de passe de la base de données.

Les fichiers inutiles ou obsolètes

Au fil des années, certains fichiers de WordPress sont tout simplement supprimés de l’archive officielle. Les mises à jour lancées depuis le tableau de bord effacent ceux que WordPress a recensés, mais une mise à jour manuelle par FTP, qui se contente d’écraser les fichiers existants, ou une mise à jour interrompue les laisse en place. Pour ma part, une demi-douzaine de fichiers à la racine étaient devenus inutiles… c’est là le problème après une décennie d’écriture sur ce blog.

Le plus simple pour les repérer est WP-CLI. La commande suivante compare vos fichiers à ceux de votre version de WordPress et signale chaque fichier modifié ainsi que chaque fichier qui ne devrait pas exister dans /wp-admin, /wp-includes et à la racine du site :

wp core verify-checksums --include-root

À la racine, elle signale aussi les fichiers étrangers à WordPress, dont certains restent utiles (fichier de vérification de la Search Console, par exemple) : examinez la liste avant de supprimer quoi que ce soit. Sans WP-CLI, téléchargez l’archive de votre version de WordPress, supprimez les dossiers /wp-admin et /wp-includes avant de les remplacer par ceux de l’archive, puis comparez les fichiers présents à la racine avec ceux de l’archive.

Au delà des fichiers propres à WordPress, vous devriez en profiter pour faire le ménage au niveau de la racine Web et surtout du dossier /wp-content car il n’est pas rare de rencontrer des dossiers qui n’ont rien à faire là. Il peut s’agir de thèmes ou d’extensions inactives, de dossiers de sauvegardes qui sont stockées au format ZIP et qui occupent une grande partie de votre espace de stockage – on ne laisse jamais les sauvegardes sur le serveur de production, d’anciens dossiers de cache, etc.

Vous connaissez des astuces pour faciliter la maintenance de votre site ? Partagez vos techniques en commentaires.

Première étape du nettoyage : supprimer ou limiter les révisions d’articles.

Avatar de Aurélien Denis

Protégez votre site WordPress

Vos données sont précieuses,
ne prenez pas le risque de tout perdre.
Confiez-moi votre maintenance !

Ces articles devraient t’intéresser…

6 réponses
  1. Avatar de Christelle
    Christelle

    Bonjour,
    Je viens de tomber sur votre article et j’aimerai vous demander quelques précisions face aux soucis que j’ai rencontré. J’ai utilisé le plugin phœnix média rename afin de changer le nom de mes nombreux fichiers images dans mon WordPress et malheureusement les anciennes url restent à l’intérieur bien que chaque image en ait une nouvelle. Je m’en suis rendue compte en voulant faire une copie de mon site via duplication avant la mise à jour WordPress 5.5, puis en vérifiant la santé de mon site ryske m’a indiqué que ces même url créent des erreurs 404. J’aimerai savoir si l’utilisation de wp sweep pourrait me permettre de les éliminer ou s’il y a un autre moyen. De même, je ne savais pas qu’un plugin installé puis désinstallé laissait des traces or je fais souvent des essais et j’aimerai pouvoir les nettoyer également et si possible conserver les modifications qu’ils aient pu apporter lorsqu’il s’agit d’optimisation d’image par exemple. Je m’explique j’ai utilisé smuch puis n’en ayant plus l’utilité je l’ai enlevé pour ne pas conserver trop de plugin inutile et mes images sont redevenues à l’identique… je me suis dit tant pis je le réinstalle et là il me dit que toutes les images sont déjà smuched … j’aurais besoin de quelque astuces de votre part pour éviter ce genre de pbs et éventuellement si possible les réparer. Je vous remercie par avance de tous les conseils que vous pourrez m’apporter. Cordialement

    1. Avatar de Aurélien Denis
      Aurélien Denis

      C’est une question complexe : en effet, l’installation d’extensions génèrent l’écriture d’informations en base de données et parfois même la création de nouvelles tables. La désinstallation d’une extension ne supprime pas ces données sauf si l’auteur prévoit ce cas et en informe l’utilisateur. Les développeurs procèdent ainsi afin de permettre la réactivation d’une extension tout en retrouvant les nombreux réglages et autres données souvent importantes (par exemple : des redirections en SEO).

      Dans votre cas, il faudrait opérer des nettoyages en profondeur ou repartir d’une base propre en faisant une extraction du contenu. Ce ne sont pas opérations simple techniquement ni sans danger. Il faut, comme toujours, peser le pour et le contre pour en déterminer l’intérêt (bugs et autres ralentissements constatés, importance pour votre activité, etc.).

  2. Avatar de Calade
    Calade

    Bonjour ,
    en recherchant des infos sur le fonctionnement de la BdD de WordPress je suis tombé sur cet tres bon article ; j’aurais une application particulière : j’ai retrouvé des notes où j’avais créé un site photo/example.com j’ai du l’oublier et ensuite j’ai créé un multisite example.com avec sous domaines test/example.com, blog/example.com, video/example.com qui fonctionnent ok.
    Sauf que si j’essaie de me connecter sur photo/example.com…ça fonctionne toujours ! Et me renvoie sur http://example.com/wp-signup.php?new=…, sous-domaine « photo » qui bien sûr n’existe pas dans l’architecture du multisite…
    Comment me débarrasser proprement de photo/example.com ?
    A part dans l’immédiat faire une redirection vers example.com pour éviter les problèmes, je ne vois qu’un nettoyage de la BdD (apres sauvegarde of course..) mais comment identifier les champs de photo/example.com ?
    Merci pour votre expertise et conseils…
    Calade

    1. Avatar de Aurélien Denis
      Aurélien Denis

      Merci d’apprécier cet article !

      Vous avez un historique compliqué et il m’est difficile de répondre avec précision à votre question. Il faudrait prendre le temps de retracer tout l’historique pour ensuite mener les opérations de nettoyage appropriées.

  3. Avatar de @guibfrance
    @guibfrance

    Merci pour cette mine d’informations !

  4. Avatar de Mlk
    Mlk

    Excellente procédure. Merci.