WordPress 评论管理:开启、审核与垃圾评论治理
评论区出问题,通常不是插件坏了,而是三个开关中的一个被关掉了:设置 → 讨论 里的全局开关、单篇文章的讨论设置、主题模板里的评论调用。这三个是独立层级,上一级的关不掉下一级的,反之也一样。先把层级理清,再看审核和垃圾评论。
设置 → 讨论:每一项分别管什么
这个页面有十几个复选框,看着杂,其实分四组。按组记比逐条背容易。
| 分组 | 选项 | 实际作用 |
|---|---|---|
| 默认状态 | 允许他人在新文章上发表评论 | 新建文章默认开评论,只对之后的文章生效 |
| 审核规则 | 评论必须经过人工批准 / 评论作者先前有已批准评论 | 前者全审,后者是「老用户免审」白名单 |
| 审核规则 | 评论必须经人工批准,如果它包含 2 个或更多链接 | 超过链接阈值自动进待审队列 |
| 通知 | 有人发表评论时发邮件通知我 | 发给站点管理员邮箱,量大时建议关 |
| 通知 | 文章有评论时发邮件通知作者 | 给文章作者发,多作者站点注意 |
| 准入 | 评论作者必须填写姓名和邮箱 | 关掉就是匿名评论,垃圾量会涨 |
| 准入 | 用户必须注册并登录才能评论 | 最严格,但会显著降低评论量 |
| 显示 | 在评论顶部显示嵌套 2 层 / 每页拆分评论 | 控制嵌套层数和分页,见下文 |
| 头像 | 默认头像、Gravatar 评级 | 不显示头像就选「无」 |
其中两个选项最容易误解。「允许他人在新文章上发表评论」只影响新建文章,老文章维持原状——所以你会发现改了设置,旧文章还是不能评论,得去文章编辑页单独改。「评论作者先前有已批准评论」是免审白名单,一旦开启,任何人在你的站上留过一条被批准的评论,之后就可以不受审核限制,垃圾评论者会利用这一点,中小站点建议关闭。
评论开关的三个层级
评论不显示,按这个顺序查,从上层到下层:
第一层:全局
设置 → 讨论,取消勾选「允许他人在新文章上发表评论」。这里关掉,全站新文章都不允许评论,但已发布的文章不受影响。
第二层:单篇文章
文章编辑页右上「显示选项」勾上「讨论」,页面下方出现讨论面板,里面可以单独勾选「允许评论」「允许 pingback 和 trackback」。批量改老文章:文章列表全选 → 批量操作 → 编辑 → 把「评论」设为「允许」,一次改一批。这是最常被忘的一步,很多「换了新主题评论全没了」的案例其实是老文章本来就没开。
第三层:主题模板
模板里没调用 comments_template(),或者调用了但判断条件写错,评论框就不会出现。检查 single.php 里有没有这一行:
<?php
if ( comments_open() || get_comments_number() ) {
comments_template();
}
?>
有些主题为了「简洁」直接删掉了这段,或者只在部分文章类型里保留。判断方法:在文章页右键检查,搜 id="comments",有容器说明模板正常,没有就是模板问题。模板的修改方式见 WordPress 主题定制,后台操作不熟可以先看 WordPress 后台入门。
还有一种「能填不能发」:提交后跳回空白页或一直转圈。这通常是 wp-comments-post.php 被安全插件拦截、或者页面缓存把 POST 请求也缓存了。前者关掉防护插件的评论拦截规则,后者在缓存插件里排除评论提交路径。安全策略的取舍见 WordPress 安全加固。
审核:把「先审后发」用对
推荐组合是这样的,兼顾体验和防垃圾:
- 「评论必须经过人工批准」不勾,让正常读者即时看到自己的评论。
- 「评论包含 2 个或更多链接时必须人工批准」勾上,这一条能拦掉八成带推广链接的垃圾。
- 「评论作者先前有已批准评论」不勾,理由前面说过。
- 「姓名和邮箱必填」勾上。
- Akismet 开着,作为第二道过滤。
待审评论在后台 评论 页面顶部有数字提示,「待审」标签页里逐条通过或标记为垃圾。标记为垃圾这个动作有额外价值:Akismet 会学习这次判断,同类内容后续会被自动拦。嫌麻烦一条条点,等于放弃了这套学习机制。
评论数量大的站点(每天上百条),人工审核不现实,改用「首次评论审核 + 老用户免审」,也就是勾上「评论作者先前有已批准评论」,同时配合验证码。这是唯一需要开白名单的场景。
垃圾评论的六个特征
认得出来就删得快。以下特征命中三条以上,基本可以直接标记垃圾:
- 邮箱域名可疑:
@qq.com配一个英文名,或者域名是随机字符串,比如user@xk2j9f.biz。 - 评论内容与文章无关:写「好文章,学到了」但文章讲的是数据库报错,明显是群发模板。
- 正文里塞链接:尤其是指向博彩、代购、私服、贷款类站点,链接锚文本通常是关键词堆砌。
- 网址字段填了推广页:评论正文很正常,但「网站」一栏指向一个卖货页面。这一类最难识别,要靠 Akismet。
- 提交时间密集:同一 IP 在几分钟内提交十几条,或者全部集中在凌晨。
- 语言混排:中文评论里夹着俄文、阿拉伯文片段,是绕过关键词库的常见手法。
已经进来的垃圾,在 评论 页面按「垃圾」筛选,全选后点「永久删除」。不要只标垃圾不删——垃圾评论仍占数据库行数,量大了会拖慢评论查询。
Akismet 与验证码:各管一段,不能互相替代
| 手段 | 拦什么 | 局限 |
|---|---|---|
| Akismet | 内容特征匹配,看正文、链接、邮箱历史 | 需要 API Key,免费版仅限非商业站;有误判 |
| 算术/图形验证码 | 机器批量提交 | 对人工 spam 无效,会降低真实用户评论意愿 |
| 评论链接数限制 | 带链接的推广评论 | 纯文本垃圾拦不住 |
| 关闭旧文章评论 | 针对历史文章的攻击面 | 对新文章无效 |
| Cloudflare 挑战 | 整个站点的自动化请求 | 配置复杂,可能影响正常访问 |
正确做法是组合,不是二选一。Akismet 负责内容判断,验证码负责流量入口,链接阈值做兜底。开启 Akismet 时注意:它会把评论内容发到外部服务器做判断,如果你的站点有隐私合规要求,要在隐私政策里说明。这类基础插件的取舍见 WordPress 安全插件 与 WordPress 必备插件。
评论分页与嵌套层数
两个设置都在 设置 → 讨论 底部:
- 每页显示多少条评论:填 20 到 50。填 0 是不分页,几百条评论一次性输出,页面会明显变慢。评论多的站控制在 30 左右。
- 启用嵌套评论,层数:最多 5 层,建议 3。超过 3 层后每层缩进 40px 左右,手机上第 4 层只剩一半宽度,正文被挤成竖条。
嵌套层数改了不生效,是因为老评论的层级已经存进数据库,改设置只影响之后的新评论。要统一,只能重建或不管它。分页后的翻页链接样式由主题决定,如果分页不显示,检查模板里有没有 paginate_comments_links()。
另外,评论分页和缓存插件容易冲突:缓存把第一页缓存住,翻页时看到还是同一批评论。缓存插件里把 ?cpage= 参数排除掉即可。
关掉评论之后,已有的评论怎么办
关评论和删评论是两件事。关掉之后已有评论默认仍然显示,很多人以为关了就等于隐藏,结果页面上还挂着三年前的广告评论。
- 只关新评论、保留旧的:全局取消「允许评论」,再批量把老文章讨论设置为「不允许」,已有评论照常显示,表单消失。
- 连旧评论一起隐藏:不要删数据库,用插件或模板判断,只在
comments_open()为真时输出评论列表。也可以直接把文章模板里的comments_template()注释掉,但这样评论数据还在,随时能恢复。 - 彻底删除:后台 评论 页面按文章筛选,全选删除。删之前导一份数据库,评论删了不可恢复。
建议用第二种。评论是内容资产,哪怕暂时不展示也别删,将来想做「用户评价」页还能用。
评论数不对:三个常见原因
「文章列表显示 0 条评论,但文章里明明有 5 条」这类问题,原因基本固定:
- 只统计已批准:
get_comments_number()默认只算 approved 状态,待审和垃圾不算。想让待审也计入,用wp_count_comments()拿明细。 - 缓存没更新:评论数存在
wp_posts.comment_count字段里,异常时进 设置 → 讨论 点一次保存,或用 WP-CLI 跑wp comment recount重算。 - 主题用了自定义计数:部分主题自己查表统计,把 pingback 也算进去了,数字会比实际多。
wp comment recount
# 重算全站评论数,修正 comment_count 字段
评论框位置的样式问题(宽度、按钮颜色、必填项星号)属于主题 CSS 范畴,改之前确认用的是子主题,否则主题一次更新全部覆盖回去。评论功能看着简单,实际涉及设置、模板、插件、缓存四层,出问题时按层往下查,比乱试插件快得多。