Supprimer / limiter les révisions d’articles de WordPress

Mis à jour le :

Les révisions d’articles permettent de restaurer à une date précise la sauvegarde du billet en question.

Bien que très pratique, cette fonctionnalité finit par encombrer la base de données après de nombreux enregistrements.

Il est donc conseillé d’effacer les révisions d’articles. Toutefois, pour aller plus loin, nous allons faire en sorte que les X dernières soient conservées pour allier performances et sécurité.

Dans l’éditeur, la ligne Révisions de la barre latérale (onglet Article) indique combien de révisions compte l’article, à partir de deux. Un clic sur ce nombre les affiche et permet d’en restaurer une avec le bouton Restaurer.

Éditeur de blocs de WordPress sur l’article publié « Préparer sa première randonnée » : la barre latérale est ouverte sur l’onglet Article et, dans le résumé (État Publié, Publier, Slug, Auteur/autrice, Modèle, Commentaires), la ligne Révisions affiche le nombre 5 sous forme de lien, au-dessus de la ligne Format (Standard).
La ligne Révisions de la barre latérale indique le nombre de révisions de l’article

#1 – Effacer toutes les révisions d’articles

Exécutez la requête SQL ci-dessous, par exemple dans l’onglet SQL de phpMyAdmin, pour supprimer la totalité des révisions de votre site : celles de vos articles et de vos pages, mais aussi celles des compositions et, avec un thème à blocs, des modèles et des styles. Après cette action, il vous sera impossible de restaurer l’un de ces contenus à une date antérieure : sauvegardez d’abord votre base de données, par exemple avec la commande wp db export de WP-CLI, pour pouvoir la restaurer en cas d’erreur.

Remplacez aussi wp_ par le préfixe de vos tables s’il est différent : il figure dans le fichier wp-config.php, sur la ligne $table_prefix (avec WP-CLI, la commande wp db prefix l’affiche).

DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision';

Cette requête efface aussi les enregistrements automatiques, qui sont des révisions particulières, ainsi que les métadonnées des révisions (table wp_postmeta) et leurs éventuels liens avec des catégories ou des étiquettes (table wp_term_relationships) : elle ne laisse aucune ligne orpheline. Si votre site utilise un cache d’objets persistant (Redis, Memcached…), videz-le ensuite, par exemple avec la commande wp cache flush.

Avec WP-CLI, une seule commande suffit, sans vous soucier du préfixe des tables : elle supprime chaque révision avec les fonctions de WordPress, métadonnées comprises.

wp post delete $(wp post list --post_type=revision --format=ids) --force

L’option --force est indispensable : sans elle, WP-CLI refuse de supprimer les révisions, qui ne passent pas par la corbeille.

#2 – Effacer les révisions en fonction d’une date

Pour ne garder que l’historique récent de vos contenus, préférez cette requête. Sa dernière condition conserve les révisions des 6 derniers mois : toutes les révisions plus anciennes seront supprimées. Adaptez la durée à votre convenance, par exemple INTERVAL 3 MONTH ou INTERVAL 1 YEAR.

DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision' AND a.post_date < NOW() - INTERVAL 6 MONTH;

Une base allégée n’est qu’un levier parmi d’autres : mon offre d’optimisation des performances WordPress s’attaque aussi au cache et aux requêtes lentes.

#3 – Limiter ou désactiver les révisions

Il est possible de désactiver les révisions. À l’aide de votre client FTP favori, connectez-vous à la racine de votre site WordPress puis ouvrez wp-config.php.

Ajoutez ensuite la ligne suivante juste avant le commentaire /* C’est tout, ne touchez pas à ce qui suit ! Bonne publication. */ (/* That's all, stop editing! Happy publishing. */ dans un fichier en anglais) ; placée après la dernière ligne du fichier, qui charge wp-settings.php, elle serait sans effet :

define('WP_POST_REVISIONS', false);

Les révisions déjà enregistrées restent alors dans la base de données, mais WordPress ne les affiche plus : effacez-les avec l’une des méthodes ci-dessus. Pour limiter le nombre de révisions plutôt que de les désactiver, indiquez un nombre à la place de false, à 5 dans cet exemple :

define('WP_POST_REVISIONS', 5);

WordPress conserve alors au plus 5 révisions par contenu (article, page…), sans compter l’enregistrement automatique. La limite s’applique à chaque enregistrement : les révisions les plus anciennes du contenu modifié sont alors supprimées. Les contenus que vous ne modifiez plus gardent en revanche toutes leurs révisions : là encore, les requêtes ci-dessus font le ménage. Sans la constante, ou avec la valeur true, le nombre de révisions est illimité.

Pour régler ce nombre selon le type de contenu, utilisez le filtre wp_revisions_to_keep, prioritaire sur la constante, dans le fichier functions.php de votre thème enfant ou dans une extension de fonctions globales. Avec WP_POST_REVISIONS réglée à 5, ce code garde jusqu’à 10 révisions pour les pages :

/**
 * Keeps up to 10 revisions for pages; other post types follow WP_POST_REVISIONS.
 */
function wpc_revisions_to_keep( $num, $post ) {
	// 0 means revisions are disabled (WP_POST_REVISIONS set to false or 0): keep it that way.
	if ( 'page' === $post->post_type && 0 !== $num ) {
		return 10;
	}

	return $num;
}
add_filter( 'wp_revisions_to_keep', 'wpc_revisions_to_keep', 10, 2 );

Les enregistrements automatiques, eux, ne s’accumulent pas : WordPress n’en conserve qu’un par contenu et par auteur, remplacé au fil de la rédaction (toutes les 60 secondes par défaut). Pour en changer la fréquence avec la constante AUTOSAVE_INTERVAL, voyez comment changer la fréquence de sauvegarde des brouillons de WordPress.

Les révisions d’articles constituent un atout majeur de WordPress. Il n’est pas rare de devoir revenir en arrière après une modification malencontreuse. Entre performances SQL et niveau de risques, à vous de trouver un juste milieu !

Pour aller au-delà des révisions, voyez comment nettoyer en profondeur la base de données.

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…

39 réponses

  1. Avatar de tellep
    tellep

    Bonjour

    Je découvre votre super site suite à la nécessité de restauration de mon site…

    MERCI !

    Ma base de données est presque saturée. J’ai installé WP Optimize. Je vois que j’ai plus de 3000 révisions d’articles. Je souhaite simplement conserver la dernière version de mes articles.
    Es-ce que je peux sans crainte supprimer toutes les révisions ?
    Je resterai bien avec la dernière version de l’article en ligne ?

    Comme j’aurai sauvegardé la base de données avant de faire l’opération je ne risque probablement pas grand chose, mais votre avis est important pour moi !

    Cordialement
    Pierre

  2. Avatar de David
    David

    Article très intéressant merci !

  3. Avatar de sylvainbr
    sylvainbr

    Bonjour,

    Voici comment j’ai intégré votre code :
    ——————————————————-
    /** Type de collation de la base de données.
    * N’y touchez que si vous savez ce que vous faites.
    */
    define(‘DB_COLLATE’,  »);

    define(‘WP_POST_REVISIONS’, 5);

    /**#@+
    * Clefs uniques d’authentification et salage.
    *
    * Remplacez les valeurs par défaut par des phrases uniques !
    * Vous pouvez générer des phrases aléatoires en utilisant
    * {@link https://api.wordpress.org/secret-key/1.1/salt/ le service de clefs secrètes de WordPress.org}.
    * Vous pouvez modifier ces phrases à n’importe quel moment, afin d’invalider tous les cookies existants.
    * Cela forcera également tous les utilisateurs à se reconnecter.
    *
    * @since 2.6.0
    */
    define(‘AUTH_KEY’, …..pas mis pour raison de sécurité….
    ——————————————————————–
    Quand je veux modifier mon article je suis à 52 révisions (et non 5)

    Est-ce que le ménage se fait à chaque connexion avec un identifiant et mot de passe?

  4. Avatar de lafeeluminelle
    lafeeluminelle

    Bonjour Aurélien,
    J’essayais l’astuce pour empêcher les révisions en collant en fin de page :
    define(‘WP_POST_REVISIONS’, false); dans mon WP-Config.PHP mais ça n’a pas marché.

    Quand je suis allée sur mon admin et mon site j’avais une page toute blanche ! Alors j’ai remis l’ancienne version du fichier sans la ligne de code du coup.

    Est-ce que la ligne de code est toujours valable pour la WordPress 3.8.1 ou 2 ? Ou ai-je mal fais mon collage ?

    Merci

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

      Il ne faut surtout pas mettre cette define en fin de fichier wp-config.php ! C’est d’ailleurs spécifié par le message C’est tout, ne touchez pas à ce qui suit ! Bon blogging !.

      Avant oui, après non ! 😉

  5. Avatar de Léon
    Léon

    Bonsoir, je ne suis pas très fort encore avec wp. Où et comment faut-il exécuter la phase 1  » requête sql » ? Merci pour votre aide!

    1. Avatar de lafeeluminelle
      lafeeluminelle

      Bonjour Léon,
      Moi je fais cette manip là : Va dont ton MySQL > WP_posts

      Là tu as des onglets et tu vas sur « Rechercher »> posts type > Revision (exécuter)
      La requête va te chercher toutes les révisions. Tu coches tout et X pour supprimer.

      Voilà.

      1. Avatar de Journal
        Journal

        Le soucis en faisant de cette façon, c’est que la suppression des enregistrements des tables wp_term_relationships et wp_postmeta qui sont liés à la révision ne seront pas supprimés. Au final il reste des lignes orphelines qui prennent inutilement de la place dans la base de données. C’est justement ce qu’on cherche à éviter.

  6. Avatar de Etienne
    Etienne

    Génial ! je suis passé d’une BDD de 240 à 110 ! Merci.

  7. Avatar de Hubert Souchaud Mesmin
    Hubert Souchaud Mesmin

    Pardon! j’ai trouvé, ne pas tenir compte svp de mes 2 commentaires,
    il suffisait de reviser 🙁

  8. Avatar de Hubert Souchaud Mesmin
    Hubert Souchaud Mesmin

    note: sur les WordPress hébergés à wordpress.com il existe un système de révisions de Pages: http://en.support.wordpress.com/pages/page-revisions/

  9. Avatar de Hubert Souchaud Mesmin
    Hubert Souchaud Mesmin

    Slt. On parle bien ici des revisions d’articles, pas de celles des Pages (statiques) de wp. Qu’en est-il pour les Pages, je ne vois rien pour les activer, existent-elles au-moins ces révisions de Pages? Merci

  10. Avatar de Lise Brodeur
    Lise Brodeur

    Un gros merci M. Denis. Je viens de faire un nettoyage sur Wamp. De 1 642 ko (BDD antérieure), c’est passé à 575 ko. Une fois la ligne du code mise avant les clés dans wp-config.php, tout est fonctionnel aussi..En faisant des modifs dans certaines pages, seulement les 5 dernières s’affichent. J’en encore beaucoup de pages à créer :). Quel allégement, merci.
    Lise, Montréal

  11. Avatar de Sébastien
    Sébastien

    Bonjour à tous,
    Quelle est la requête pour supprimer les révisions svp ?
    Merci par avance

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

      Il suffit de lire…

    2. Avatar de Eskimon
      Eskimon

      Pour supprimer TOUTES les révisions :

      DELETE a,b,c
      FROM wp_posts a
      LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
      LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
      WHERE a.post_type = ‘revision’;

  12. Avatar de Anais
    Anais

    C’est bon de mon côté.
    Comme dit dans mon comm précédent, j’ai placé le code define(‘WP_POST_REVISIONS’, 2); dans mon fichier wp-config, puis j’ai exécutée la requête pour supprimer les révisions et tout est bon. Merci

  13. Avatar de Anais
    Anais

    Bonjour Bonjour,
    J’ai placé le code define(‘WP_POST_REVISIONS’, 2); dans mon fichier wp-config.
    Sur le test que je viens de faire en créant un article sur mon site, je vois bien que les deux dernières révisions restent affichées. Par contre, pour tous mes anciens articles (j’en ai certains avec des dizaines de révisions), il n’affichent pas les deux dernières révisions (mais tout encore). Faut-il faire autre chose pour les supprimer ?

  14. Avatar de ANais
    ANais

    Bonjour,
    Effectivement les révisions étaient masquées. Merci.

  15. Avatar de ANais
    ANais

    Bonjour,
    Utilisant la version 3.5.1 de WordPress, je ne vois pas les révisions d’articles. Est-ce à dire que WordPress supprime maintenant automatiquement les anciennes versions des articles (donc plus de besoin de passer par le code sql donné)?
    Merci

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

      Vérifies dans le menu Options de l’écran situé en haut à droite de ta fenêtre pour vérifier que les révisions ne sont pas masquées car rien n’a changé dans le core de WordPress à ce sujet.

  16. Avatar de Alex Alouit (@alexalouit)
    Alex Alouit (@alexalouit)

    Bonjour Aurélien,

    Comment se passe la purge automatique des révisions après la mise en place de la variable « WP_POST_REVISIONS »?
    Est-elle rétroactif?

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

      Non il te faut lancer une requête MySQL pour supprimer les anciennes. 😉

      1. Avatar de doomer78
        doomer78

        Mettre à jour l’article/page permet d’afficher que les 5 dernières révisions, cela ne les supprimerait pas dans la BDD ? Je ne sais pas comment faire pour vérifier cela malheureusement…

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

          Si les révisions seront supprimées si tu fixes le paramètre à 5. La liste des révisions affichée dans l’éditeur de WordPress correspond à celles présentes en base.

  17. Avatar de Fabrice
    Fabrice

    Salut Aurélien,

    Merci de ces infos, j’utilise pour ma part dans le config:

    define(‘WP_POST_REVISIONS’, 2);
    define(‘EMPTY_TRASH_DAYS’, 3 );

    Sinon y a aussi WP-Optimize pour nettoyer et alléger la BDD 😉

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

      Pour info, j’ai divisé par 2 le poids de ma base en supprimant les anciennes révisions. 😉

  18. Avatar de kindy
    kindy

    Merci une fois de plus pour ses articles intéressent. Mais j’ai tenté cette requête mais à chaque fois j’ai une :
    Erreur SQL :

    ERREUR: erreur de syntaxe sur ou près de « a »
    LINE 1: DELETE a,b,c
    ^

    Dans l’instruction :
    DELETE a,b,c

    FROM wp_posts a

    LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)

    LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)

    WHERE a.post_type = ‘revision’

    AND a.post_date < '2012-09-17';

    je sais pas si ma base n'a pas un problème et il es arriver même que j'ai eu envie de recharger un backup suite à un problème sur le blog. Et j'ai toujours un message d'erreur. Tu n'aurais pas une piste..
    merci par avance

  19. Avatar de Julien
    Julien

    Merci pour cet article, il s’accorde bien avec celui sur la sauvegarde ! 🙂

  20. Avatar de Ohoud
    Ohoud

    merci pour ce tutorial je vien de supprimer 10Mo de ma base de données merci beaucoup

  21. Avatar de royer
    royer

    Bonjour
    Impossible pour moi de trouver comment revenir sur une erreur. J’ai ajouter une photo a une galerie et puis après seule la dernière photo s’affiche (les autres ont disparues). C’a m’arrive souvent.
    A chaque fois il faut tout refaire car je ne sais pas comment revenir en arrière.
    ps: je suis nul en informatique et ne comprends pas les infos trop complexe.
    Si tu as la réponse, je te remercie à l’avance.
    Yann

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

      Je ne pense pas pouvoir t’aider davantage via commentaires interposés…

  22. Avatar de Autopedia
    Autopedia

    Merci du tuyau, j’ai pu alléger ma table wp_posts de 20 % 🙂

  23. Avatar de Classics
    Classics

    Merci pour ce tuto très clair. Résultat de ma requête : plus de 11,000 écritures supprimées.
    Je cherchais à faire ça depuis longtemps. Le ménage est fait.
    Merci.

  24. Avatar de Olivier C
    Olivier C

    PS : je parlais du code de désactivation des révisions…

  25. Avatar de Olivier C
    Olivier C

    Ouf, j’ai enfin compris un truc après avoir cherché pendant des semaines : il ne faut pas mettre le code n’importe où dans le fichier wp-config sinon, au mieux, cela ne marche pas… au pire, tous mes articles et pages étaient passés à la poubelle !

    J’ai finalement placé le code avant les clefs d’authentification et c’est OK…

    1. Avatar de A-snowboard
      A-snowboard

      Juste un petit mot pour dire que tout a fonctionné pour moi !
      Mais comme le dit olivierC, il faut mettre le code avant les clef d’authentification. Sinon ça ne marche pas !

      Bonne soirée !

  26. Avatar de Mr Xhark
    Mr Xhark

    Admettons que j’utilise :
    define(‘WP_POST_REVISIONS’, 5);

    Il me semble plutôt logique de supprimer les révisions >5, as tu une requête SQL en tête pour cette opération ?

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

      Pas vraiment si ce n’est qu’en activant cette fonction tu auras les 5 sauvegardes plus récentes… 🙂