搜索全站
插件 12 分钟阅读

Disable Comments 彻底关闭评论:插件配置与残余表单清理

关了讨论设置,前台还在显示评论框?Disable Comments 能一键停用并清理历史数据,但主题模板、REST 接口和 pingback 需要处理。本文给出插件配置加残余输出清理的完整方案。

U
UFO_PF 2023-09-08 · 阅读 12 分钟
Di 插件
阅读提示
本文约 4,545 字,预计阅读 12 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:后台关了,前台评论框还在

企业站、B2B 外贸站、文档站基本上不需要评论功能。常见的做法是:后台「设置 → 讨论」取消”允许他人在新文章上发表评论”,然后以为搞定了。

实际结果往往是三件事没解决:一是前台文章底部依旧渲染出评论区(因为主题模板里写死了 comments_template(),而 comments_open() 的判断被主题忽略或只影响表单部分);二是后台仍然能收到 pingback 垃圾通知,甚至文章被引用后自动出现在”讨论”里;三是 REST API 的 /wp-json/wp/v2/comments 依然暴露,任何人都能读到评论数据,甚至有配置不当的站点允许匿名写。

WordPress 的”评论”其实由三块组成:评论(comment)、引用通知(pingback/trackback)、以及后台与接口层的入口。Disable Comments 这个插件负责第一块的整体停用与历史数据清理,后面两块要自己补齐。

原理分析:关闭评论要覆盖的五个入口

入口 表现 处理方式
文章编辑页的讨论框 后台仍可开关 remove_post_type_support()
前台评论表单 comments_template() 输出 过滤器 comments_open / 改模板
后台评论菜单与仪表盘 菜单项、待审数 remove_menu_page()
REST API /wp/v2/comments rest_endpoints 过滤器
XML-RPC pingback 垃圾 pingback 通知 xmlrpc_methods 过滤器

插件做的是”全局开关”:它在 comments_open、pings_open、comments_array 这几个过滤器上统一返回关闭,并提供删除历史评论的界面。但它不可能知道你的主题在哪里调用了 comments_template(),也不可能替你决定要不要关 REST 接口——这些是主题和站点策略层面的事。

还有一点容易被忽略:“关闭”不等于”删除”。插件提供的是”停用”,已有评论数据仍在数据库里;要不要物理删除,是另一个决定,且删除不可回滚。

保姆级实操

第一步:安装并配置 Disable Comments

后台「设置 → Disable Comments」,两种模式:

  • Everywhere:全站关闭;
  • On certain post types:只在勾选的类型上关闭(比如保留文章的评论、关掉产品的评论)。

保存后,前台评论表单消失,后台评论菜单提示已停用。界面下方通常还有一块「Delete Comments」,用于把已有评论从数据库物理删除——这一步务必在备份之后做。

第二步:清理后台残余入口

即使评论停用了,后台菜单、文章编辑页的讨论元框、仪表盘的”近期评论”都还在。用一段代码统一收掉:

add_action( 'admin_init', function () {
    // 移除评论菜单与编辑页的讨论元框
    remove_menu_page( 'edit-comments.php' );
    remove_meta_box( 'commentsdiv',      'post', 'normal' );
    remove_meta_box( 'commentstatusdiv', 'post', 'normal' );
    remove_meta_box( 'commentsdiv',      'page', 'normal' );

    // 移除文章/页面对评论与引用的支持
    remove_post_type_support( 'post', 'comments' );
    remove_post_type_support( 'post', 'trackbacks' );
    remove_post_type_support( 'page', 'comments' );
    remove_post_type_support( 'page', 'trackbacks' );
} );

// 移除仪表盘的"近期评论"小工具
add_action( 'wp_dashboard_setup', function () {
    remove_meta_box( 'dashboard_recent_comments', 'dashboard', 'normal' );
} );

// 移除顶部工具栏的评论气泡
add_action( 'admin_bar_menu', function ( $wp_admin_bar ) {
    $wp_admin_bar->remove_node( 'comments' );
}, 999 );

第三步:彻底关掉前台输出与引用通知

// 前台一律关闭评论与 ping,返回 false
add_filter( 'comments_open', '__return_false' );
add_filter( 'pings_open',    '__return_false' );

// 已有评论也不再输出(防止主题直接遍历 comments)
add_filter( 'comments_array', '__return_empty_array' );

// 关闭评论 feed
add_filter( 'feed_links_show_comments_feed', '__return_false' );

如果主题模板里硬写了 comments_template(),最干净的做法是直接编辑 single.php / page.php 把这一行删掉;不想改主题就用 comments_template 过滤器指向一个空文件:

add_filter( 'comments_template', function () {
    return get_stylesheet_directory() . '/no-comments.php';  // 内容为空的文件
} );

第四步:关闭 REST 评论接口

add_filter( 'rest_endpoints', function ( $endpoints ) {
    unset( $endpoints['/wp/v2/comments'] );
    unset( $endpoints['/wp/v2/comments/(?P<id>[\d]+)'] );
    return $endpoints;
} );

改完用 curl -s https://mimangfei.com/wp-json/wp/v2/comments | head 验证,应返回 404 的 JSON 错误体。

第五步:堵住 pingback 垃圾

// 移除 XML-RPC 里的 pingback 方法
add_filter( 'xmlrpc_methods', function ( $methods ) {
    unset( $methods['pingback.ping'] );
    unset( $methods['pingback.extensions.getPingbacks'] );
    return $methods;
} );

// 去掉响应头里的 X-Pingback,减少被扫描
add_filter( 'wp_headers', function ( $headers ) {
    unset( $headers['X-Pingback'] );
    return $headers;
} );

第六步:清理已有数据(可选)

# 先看有多少条
wp comment count

# 确认不需要后,删除全部已批准的评论(不可回滚,先备份)
wp db export before-comment-delete.sql
wp comment delete $(wp comment list --format=ids --status=approve) --force

# 顺手清掉修订版本等冗余,减小数据库体积
wp post delete $(wp post list --post_type='revision' --format=ids) --force

常见踩坑

  1. 只关讨论设置,没关 REST 接口。 /wp-json/wp/v2/comments 依然可读,等于数据还公开着。
  2. comments_open 被主题或插件二次覆盖。 有的主题用的是自己定义的判断函数,过滤器优先级不够就失效;把 add_filter 的优先级提到 100 试试。
  3. 删除了评论才发现要做数据留存。 评论有时是客服记录或用户反馈,删前先导出一份 CSV 留档(导出工具的做法本站另有专文)。
  4. 误以为关闭评论能减少垃圾注册。 评论垃圾和注册垃圾是两回事,后者要靠登录保护与验证码。
  5. remove_menu_page() 之后客户找不到入口。 如果是交给客户维护的站点,保留菜单但把权限收紧(见 User Role Editor 权限控制)可能比直接隐藏更好。
  6. XML-RPC 整体关闭影响其他功能。 有些移动客户端、Jetpack、部分备份插件依赖 XML-RPC,只摘掉 pingback 两个方法比一刀切安全。
  7. 案例: 某 B2B 站用了 Disable Comments 全站关闭,半年后发现 Google 收录了一批形如 /2023/05/xx/feed/ 的评论 feed 地址,且每天仍有上百条 pingback 请求打到服务器,日志里全是 pingback.ping。排查后发现插件只处理了”评论”,没处理 feed 与 XML-RPC。补齐 feed_links_show_comments_feed、xmlrpc_methods 两段过滤,并在 Nginx 层对 /xmlrpc.php 限流后,日志立刻干净了。教训:一个功能往往有多个技术入口,关掉 UI 不等于关掉能力。

总结

彻底关闭评论的清单是五条:插件做全局停用 → 代码清后台入口(菜单、元框、工具栏、仪表盘)→ 过滤器关前台输出与 feed → 摘掉 REST 端点 → 封 pingback 与 X-Pingback 头。历史数据要不要物理删除单独决策,删之前一定导出留档。

判断标准:前台无表单、后台无入口、/wp-json/wp/v2/comments 返回 404、curl 测 xmlrpc.php 的 pingback.ping 应报错。操作过程中如果动了数据库,记得按 批量替换文章内容的备份原则 先留一份备份;站点邮件通知里若还带评论提醒,可以参照 WordPress 邮件发送排查 一并关掉。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。