Décocher « Autoriser les commentaires sur les nouvelles publications » dans Réglages › Commentaires ne ferme rien de ce qui existe. L’écran le dit lui-même, sous la case : « Les modifications ne seront ici appliquées qu’aux nouvelles publications. » Les anciens articles, pages et médias déjà ouverts conservent leur état. Ce guide suit le code de WordPress 7.1.4 ($wp_version lu dans wp-includes/version.php du dépôt wordpress-develop).
Décochez le réglage pour l’avenir. Fermez l’existant contenu par contenu en base : modification groupée pour les articles et les pages, WP-CLI ou une requête SQL pour tout le reste, médias compris. Puis décidez à part du sort des commentaires déjà publiés : fermer ne les efface pas.
Ce que le réglage de Discussion change vraiment
Deux options déterminent l’état par défaut des nouveaux contenus : default_ping_status et default_comment_status.wp_insert_post(), dans wp-includes/post.php, appelle alors get_default_comment_status() pour remplir les colonnes comment_status et ping_status de la table des publications. Changer les valeurs par défaut ne réécrit pas les contenus existants.
get_default_comment_status(), dans wp-includes/comment.php, ne traite pas tous les types de la même façon :
- les pages naissent fermées dans le cœur WordPress, aux commentaires comme aux pings, quel que soit le réglage. Une page ouverte l’a été à la main, par une extension, par un import ou par une version plus ancienne ;
- les articles suivent les deux options ;
- les médias (type
attachment) déclarent la prise en charge des commentaires mais pas des rétroliens : leurs commentaires suiventdefault_comment_status, leurs pings naissent fermés. Chaque image envoyée pendant que le réglage était coché est donc ouverte aux commentaires, et le reste.
Ce dernier point est le plus souvent oublié. Sur un site antérieur à WordPress 6.4, la migration upgrade_640() a activé l’option wp_attachment_pages_enabled : chaque média garde sa propre page publique, avec le formulaire du thème. Sur un site installé depuis, cette page redirige vers le fichier (redirect_canonical(), dans wp-includes/canonical.php), mais le média reste ouvert en base, et c’est la base que lit la réception des commentaires.
Où WordPress lit l’état d’un contenu
comments_open() et pings_open(), dans wp-includes/comment-template.php, comparent simplement la colonne à la chaîne open, puis passent le résultat aux filtres du même nom. Tout le reste en dépend : comment_form() n’affiche rien si comments_open() est faux, wp_handle_comment_submission() refuse l’envoi avec l’erreur comment_closed (code 403, « Les commentaires sont fermés pour cet article. »), l’API REST renvoie rest_comment_closed, et la réception des pings par XML-RPC ou par wp-trackback.php consulte pings_open().
La fermeture automatique après N jours
Plus bas sur le même écran, « Fermez automatiquement les commentaires sur les publications anciennes. » et le nombre de jours associé (options close_comments_for_old_posts et close_comments_days_old, 14 par défaut) semblent régler le problème. Le code dit trois limites.
- L’état enregistré de chaque contenu reste intact.
_close_comments_for_old_post(), accrochée àcomments_openetpings_open, répond « fermé » à la volée. Décochez la case pour retrouver l’état enregistré de chaque article. - Seuls les articles sont concernés. La liste des types vient du filtre
close_comments_for_post_types, qui vautarray( 'post' )par défaut. Pages et médias y échappent. - Zéro jour désactive tout. La fonction sort dès que
close_comments_days_oldvaut 0. Le plus petit réglage utile est 1, et un article reste alors ouvert pendant son premier jour.
Fermer l’existant depuis l’administration
Pour les articles et les pages, la modification groupée suffit. Dans la liste, cochez tout, choisissez « Modification groupée » dans « Actions groupées », puis « Appliquer ». Le panneau propose une liste Commentaires, et pour les articles seulement une liste Pings ; mettez les deux sur « Refuser », puis « Mettre à jour ». La liste n’affiche que 20 lignes par défaut : « Options de l’écran » monte la limite jusqu’à 999.
bulk_edit_posts(), dans wp-admin/includes/post.php, enregistre chaque contenu par wp_update_post(). Deux effets à connaître : la date de modification de chaque contenu passe à l’instant présent, et les contenus ouverts par un autre utilisateur sont sautés (wp_check_post_lock()).
Pour les médias, il n’y a pas de modification groupée : la liste de la médiathèque ne propose que la corbeille, la suppression et le rattachement. Il faut ouvrir chaque média dans son écran de modification, où la boîte de discussion est masquée par défaut (get_hidden_meta_boxes(), dans wp-admin/includes/screen.php) ; on l’affiche par « Options de l’écran ». Au-delà de quelques fichiers, passez par la ligne de commande.
Fermer en masse avec WP-CLI
Dans un terminal Bash avec WP-CLI et GNU xargs, exportez la base vers un dossier privé hors de la racine web. Remplacez le chemin d’exemple, puis comptez ce qui est ouvert. La commande wp post list transmet --comment_status et --ping_status à WP_Query, qui sait filtrer sur ces deux colonnes :
wp db export /chemin/prive/avant-commentaires.sql
wp post list --post_type=post,page,attachment --post_status=publish,draft,pending,private,future,inherit --comment_status=open --format=count
wp post list --post_type=post,page,attachment --post_status=publish,draft,pending,private,future,inherit --ping_status=open --format=countPuis fermez, en deux passes pour ne rater aucune combinaison :
set -euo pipefail
wp post list --post_type=post,page,attachment --post_status=publish,draft,pending,private,future,inherit --comment_status=open --format=ids | xargs -r -n 100 wp post update --comment_status=closed
wp post list --post_type=post,page,attachment --post_status=publish,draft,pending,private,future,inherit --ping_status=open --format=ids | xargs -r -n 100 wp post update --ping_status=closed
wp option update default_comment_status closed
wp option update default_ping_status closedLa liste explicite des statuts inclut inherit pour les médias.wp post update passe, comme l’administration, par wp_update_post() : dates de modification rafraîchies, crochets des extensions déclenchés. Si la liste est vide, xargs -r saute la commande. Chaque appel traite au plus 100 identifiants.
Ou en une requête SQL
Sur un gros site, une requête est plus rapide et ne touche pas aux dates de modification. Sauvegarde d’abord. Remplacez wp_ par le préfixe du site, indiqué dans$table_prefix dans wp-config.php. Le guide sur l’accès refusé montre ce qu’un préfixe mal recopié peut casser.
SELECT post_type, comment_status, ping_status, COUNT(*) AS nombre
FROM wp_posts
WHERE post_type IN ('post', 'page', 'attachment')
AND post_status IN ('publish', 'draft', 'pending', 'private', 'future', 'inherit')
GROUP BY post_type, comment_status, ping_status;Vérifiez le décompte et la sauvegarde avant d’exécuter la mise à jour.
UPDATE wp_posts
SET comment_status = 'closed', ping_status = 'closed'
WHERE post_type IN ('post', 'page', 'attachment')
AND post_status IN ('publish', 'draft', 'pending', 'private', 'future', 'inherit')
AND (comment_status <> 'closed' OR ping_status <> 'closed');La requête passe à côté de WordPress, donc de son cache. Avec un cache d’objets persistant (Redis, Memcached), videz-le ensuite (wp cache flush), sinon des copies anciennes répondront encore « ouvert » ; le guide du verrou de mise à jour décrit le même décalage. Les deux colonnes sont déclarées default 'open' dans wp-admin/includes/schema.php : une ligne insérée sans passer par wp_insert_post() naît ouverte.
Fermer n’est pas masquer
Cacher le formulaire par une règle CSS ou en retirant l’appel du thème enlève le formulaire à l’écran. Une requête directe à wp-comments-post.phpsuit encore les contrôles de WordPress, dont comments_open() et les réglages d’accès et de modération. L’API REST vérifie aussi l’ouverture du contenu.
À l’inverse, fermer ne cache pas les commentaires existants. comments_template() ne teste pas comments_open() : le fichier comments.php du thème est chargé, et la plupart des thèmes y listent les commentaires approuvés au-dessus d’une mention de fermeture.
Gérer les commentaires déjà publiés
Les commentaires utiles peuvent rester visibles après fermeture. Pour retirer un commentaire, repérez-le dans l’écran Commentaires et mettez-le à la corbeille. Les avis produits se gèrent séparément dans WooCommerce. Consultez la documentation WooCommerce sur les avis.
Sans réécrire la base
Les méthodes ci-dessus modifient chaque contenu une fois pour toutes. Si vous préférez un interrupteur, Mes Commentaires ne fait rien à l’activation : vous choisissez les types de contenu concernés, et elle ferme leurs commentaires et leurs pings natifs, puis refuse les envois par le circuit standard et par l’API REST. Les discussions existantes et les réglages natifs restent intacts ; désactiver l’extension ou désélectionner un type rend la main aux réglages de WordPress. Elle ne gère ni les avis produits, ni les notes éditoriales, ni les types de contenu personnalisés, ni les formulaires de contact, ni ce qu’une autre extension écrit directement en base.
Vérifier
wp eval 'var_dump( comments_open( 123 ), pings_open( 123 ) );'Remplacez 123 par l’identifiant d’un ancien article, d’une page et d’un média. Attendu : deux bool(false) à chaque fois. Après une fermeture enregistrée en base, le décompte SQL doit montrerclosed sur les deux colonnes pour les contenus ciblés. Avec Mes Commentaires, vérifiez l’état renvoyé par WordPress, qui applique les filtres de l’extension. Contrôlez aussi les valeurs par défaut dans Réglages › Discussion.