WordPress 垃圾评论确实是一个让人头疼的常见问题,如果不加限制,不仅会影响网站的观感,还会拖慢数据库的查询速度。不过,通过优化内置设置和借助一些外部工具,你可以轻松屏蔽 99% 的垃圾评论。
以下是针对 WordPress 优化垃圾评论防御的完整指南:
一、 优化 WordPress 原生“讨论”设置
WordPress 自身提供了一些基础但非常有效的防御机制。请登录你的后台,进入 设置 (Settings) -> 讨论 (Discussion),进行以下调整:
- 基本要求: 勾选“评论作者必须填入姓名和电子邮件地址”。大多数垃圾评论机器人无法或不会填写完整的有效信息。
- 注册用户限制(可选): 如果你的网站不需要游客评论,可以勾选“用户必须注册并登录才可以发表评论”。这是最彻底的防垃圾手段。
- 自动关闭旧文章评论: 勾选“自动关闭发布 X 天后的文章上的评论”(建议设置为 30 天或 60 天)。很多垃圾评论机器人专门扫描老文章进行轰炸。
- 评论审核机制:
- 勾选“评论必须经由人工批准” (如果你希望完全掌控)。
- 或者退一步,勾选“评论者必须有已批准的评论”。这样老用户可以自由发言,而新面孔会被拦截审核。
- 限制链接数量: 垃圾评论通常包含大量外部链接。在“评论审核”部分,将“当一条评论包含 2 个或更多链接时,将其放入等待审核队列”的值改为 1 或 2。
- 黑名单词库: 在“不允许的评论关键词 (Disallowed Comment Keys)”文本框中,输入常见的垃圾评论词汇(如:casino, viagra, crypto, 各种不雅词汇以及带
http://的特征码)。包含这些词的评论将被直接移入垃圾箱。
二、 启用专业的防垃圾评论插件
仅靠原生设置是不够的,你需要专业的插件来充当“保安”。
- Akismet Anti-Spam(官方首推): 这是 WordPress 官方维护的插件,基于全球大数据库来识别垃圾评论。对于个人非商业博客是免费的,拦截率极高。
- Antispam Bee(最佳免费替代): 如果你不想注册 Akismet 账号,Antispam Bee 是最好的选择。它完全免费,无广告,不将数据发送到第三方服务器(符合 GDPR),并且可以直接在本地通过匹配规则屏蔽垃圾评论。
三、 添加无感人机验证 (CAPTCHA)
很多垃圾评论是由自动化脚本(Bot)发出的。在评论区加上人机验证可以有效阻挡它们。为了不影响真实用户的体验,建议使用“无感验证”:
- Cloudflare Turnstile: 目前体验最好的验证方式之一。验证过程通常在后台静默完成,用户不需要“找红绿灯”或“找斑马线”。你可以通过安装相关的 Turnstile 插件将其集成到评论表单中。
- Google reCAPTCHA v3: 同样是无感验证,根据用户的浏览行为打分来判断是否是机器人。
四、 屏蔽特定的恶意 IP(进阶)
如果你发现垃圾评论总是来自特定的国家或几个固定的 IP 段,你可以从网络层面对其进行拦截:
- 使用 Cloudflare: 如果你的网站接入了 Cloudflare CDN,可以在其后台的 安全性 (Security) -> WAF 中设置规则,直接拦截高风险国家/地区的访问,或者开启“Bot Fight Mode”(机器人攻击应对模式)。
为 WordPress 网站添加无感人机验证(Invisible CAPTCHA)是一个非常明智的选择,它能在不打扰真实访客的前提下,将绝大多数自动化垃圾评论机器人拒之门外。
目前主流且体验最好的两种无感验证方式是 Cloudflare Turnstile 和 Google reCAPTCHA v3。我为你整理了这两种方式的详细图文配置步骤,你可以任选其一(我个人更推荐 Cloudflare Turnstile,因为它的加载速度更快,且在国内的网络连通性更好)。
方案一:使用 Cloudflare Turnstile(首选推荐)
Cloudflare Turnstile 是一种不需要用户寻找“红绿灯”或“斑马线”的验证方式,体验极佳。
步骤 1:获取 Turnstile 密钥
- 访问并登录 Cloudflare 官网(如果没有账号,免费注册一个即可,不需要把网站域名托管在 Cloudflare 也能使用)。
- 在左侧菜单栏找到并点击 “Turnstile”。
- 点击 “添加站点 (Add Site)”。
- 填写你的网站名称和域名。在“微件模式 (Widget Mode)”下,务必选择 “不可见 (Invisible)” 模式。
- 点击创建后,你将获得两个关键信息:站点密钥 (Site Key) 和 机密密钥 (Secret Key)。请将它们复制下来。
步骤 2:在 WordPress 中安装配置插件
- 登录你的 WordPress 后台,前往 插件 (Plugins) -> 安装插件 (Add New)。
- 在搜索框输入 Simple Cloudflare Turnstile(作者是 Elliot Richmond,这是一个轻量且非常受欢迎的免费插件)。
- 点击“现在安装”并“启用”。
- 前往 设置 (Settings) -> Cloudflare Turnstile。
- 将刚才复制的 站点密钥 (Site Key) 和 机密密钥 (Secret Key) 粘贴到对应的输入框中。
- 向下滚动,找到 “Comment Forms (评论表单)” 或类似的选项并勾选它,这样验证码就会在评论区生效。
- 保存更改。
方案二:使用 Google reCAPTCHA v3
这是 Google 推出的最新版无感验证,它通过分析用户的鼠标轨迹和浏览行为在后台默默进行打分验证。
步骤 1:获取 reCAPTCHA 密钥
- 访问 Google reCAPTCHA 官网 并点击顶部的“v3 Admin Console”登录。
- 点击右上角的 “+” 号注册新网站。
- 填写标签(你的网站名),并在“reCAPTCHA 类型”中选择 基于分数的 (v3)。
- 添加你的网站域名,勾选同意服务条款后提交。
- 你将获得 网站密钥 (Site Key) 和 密钥 (Secret Key)。复制它们。
步骤 2:在 WordPress 中安装配置插件
- 登录 WordPress 后台,前往 插件 (Plugins) -> 安装插件 (Add New)。
- 搜索并安装 Advanced noCaptcha & invisible Captcha 插件(或者搜索 “reCAPTCHA”,有很多评价很高的免费插件可选)。
- 启用插件后,前往后台左侧的 设置 (Settings) -> Advanced noCaptcha。
- 在“版本”选项中选择 V3。
- 填入你复制的 网站密钥 和 密钥。
- 在“启用对象 (Enable Forms)”选项卡中,勾选 “评论表单 (Comment Form)”。
- 根据需要调整“未通过验证时的错误提示信息”,然后保存设置。
配置完成后的测试
无论是哪种方案,设置好之后,请务必退出 WordPress 后台账号(或者打开浏览器的无痕/隐私窗口),访问你网站的一篇文章并尝试发表一条评论。
- 如果你看到评论框附近有一个非常小的保护徽标(通常在右下角),并且可以正常提交评论,说明无感验证已经成功生效!
你打算使用 Cloudflare 还是 Google 的方案?面向国内这里使用Cloudflare代码版实现此功能。
跳过插件,直接用代码实现 Cloudflare Turnstile 确实是一个非常极客且高效的做法!这不仅能保持 WordPress 的轻量化,还能避免安装过多插件拖慢网站速度。
要通过代码将 Turnstile 部署到 WordPress 的评论区,我们需要用到 WordPress 的钩子(Hooks)。整个过程分为三步:加载官方 JS 脚本、在评论框插入验证组件、在提交评论时进行后端验证。
为了安全起见,强烈建议你将以下代码添加到子主题(Child Theme)的 functions.php 文件中,或者使用像 WPCode 这样的代码片段管理插件,以免主题更新时代码丢失或整站崩溃。
完整的实现代码
请将下面这段完整的 PHP 代码复制,并替换掉代码中的 你的_SITE_KEY 和 你的_SECRET_KEY(这两个密钥你在 Cloudflare 后台创建站点时可以获取):
// 1. 在包含评论的页面前端加载 Cloudflare Turnstile 的 JavaScript 脚本
add_action( 'wp_enqueue_scripts', 'custom_enqueue_turnstile_script' );
function custom_enqueue_turnstile_script() {
// 只有在单篇文章/页面且允许评论时才加载,避免全局加载拖慢速度
if ( is_singular() && comments_open() ) {
wp_enqueue_script( 'cf-turnstile', 'https://challenges.cloudflare.com/turnstile/v0/api.js', array(), null, true );
}
}
// 2. 在 WordPress 评论表单中输出 Turnstile 验证组件 (DOM)
function custom_add_turnstile_widget() {
// 替换为你的 Site Key
$site_key = '你的_SITE_KEY';
// data-theme="auto" 会自动适应用户的深色/浅色模式
echo '<div class="cf-turnstile" data-sitekey="' . esc_attr( $site_key ) . '" data-theme="auto" style="margin-bottom: 15px;"></div>';
}
// 针对未登录访客的评论表单
add_action( 'comment_form_after_fields', 'custom_add_turnstile_widget' );
// 针对已登录用户的评论表单(可选,如果你只想拦截游客,可以注释掉这行)
add_action( 'comment_form_logged_in_after', 'custom_add_turnstile_widget' );
// 3. 拦截评论提交请求,在服务器端验证 Turnstile 的 Token 是否合法
add_filter( 'preprocess_comment', 'custom_verify_turnstile_token' );
function custom_verify_turnstile_token( $commentdata ) {
// 替换为你的 Secret Key
$secret_key = '你的_SECRET_KEY';
// 检查表单中是否包含 Turnstile 的响应数据
if ( ! isset( $_POST['cf-turnstile-response'] ) || empty( $_POST['cf-turnstile-response'] ) ) {
wp_die( '<strong>错误:</strong> 请完成人机验证。' );
}
$token = sanitize_text_field( $_POST['cf-turnstile-response'] );
$ip = $_SERVER['REMOTE_ADDR'];
// 向 Cloudflare 发送 POST 请求验证 Token
$verify_url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
$response = wp_remote_post( $verify_url, array(
'body' => array(
'secret' => $secret_key,
'response' => $token,
'remoteip' => $ip,
),
) );
// 检查请求是否出现网络错误
if ( is_wp_error( $response ) ) {
wp_die( '<strong>错误:</strong> 验证服务连接失败,请稍后再试。' );
}
// 解析 Cloudflare 返回的 JSON 结果
$body = wp_remote_retrieve_body( $response );
$result = json_decode( $body );
// 如果验证失败,阻止评论提交
if ( ! $result->success ) {
wp_die( '<strong>错误:</strong> 人机验证失败,请刷新页面重试。' );
}
// 验证通过,放行评论
return $commentdata;
}
测试代码是否生效
添加完代码并保存后,请务必进行以下测试:
- 清理缓存: 如果你的网站使用了缓存插件(如 WP Rocket、W3 Total Cache)或 CDN 缓存,请先清理一次缓存。
- 检查前端: 打开浏览器的无痕/隐私模式,访问你的一篇文章。看一看评论提交按钮的上方是否出现了一个 Cloudflare 的保护图标(因为你设置的是不可见模式,所以可能只显示一个小徽标,或者在后台静默加载)。
- 提交评论测试: 尝试以游客身份提交一条评论。如果评论成功发布或进入待审核状态,说明前后端打通了。
- 拦截测试: 你可以在浏览器的开发者工具(F12)中,手动把表单里
<div class="cf-turnstile">这个节点删掉,然后点击提交评论。如果页面提示“错误:请完成人机验证”,说明你的后端防护代码生效了。

使用纯代码实现 Google reCAPTCHA v3 是一个非常棒的选择。v3 版本的核心优势在于基于行为打分(Score),它完全不需要在前端显示任何验证小部件,对真实访客的打扰降到了零。
对于像 Arkhe 这类本身就极其注重代码简洁、轻量和性能优化的现代主题来说,直接将代码集成到子主题的 functions.php 中,不仅能保持极速的加载体验,还能有效避免外部臃肿插件可能带来的前端样式或 JS 冲突。
与 Turnstile 相比,reCAPTCHA v3 的前端逻辑稍微不同:它需要在访客点击“提交评论”的那一瞬间,通过 JavaScript 拦截提交动作,静默向 Google 申请一个 Token,然后再把 Token 和评论一起发送给服务器。
以下是完整的实现代码,请将 你的_SITE_KEY 和 你的_SECRET_KEY 替换为你从 Google 获取的真实密钥。
完整的实现代码
// 1. 在包含评论的页面前端加载 Google reCAPTCHA v3 的 API 脚本
add_action( 'wp_enqueue_scripts', 'custom_enqueue_recaptcha_v3_script' );
function custom_enqueue_recaptcha_v3_script() {
if ( is_singular() && comments_open() ) {
$site_key = '你的_SITE_KEY';
// 动态加载脚本并传入 Site Key
wp_enqueue_script( 'google-recaptcha-v3', 'https://www.google.com/recaptcha/api.js?render=' . $site_key, array(), null, true );
}
}
// 2. 在评论表单中插入隐藏字段,并添加 JS 拦截逻辑
add_action( 'comment_form', 'custom_recaptcha_v3_input_and_js' );
function custom_recaptcha_v3_input_and_js() {
$site_key = '你的_SITE_KEY';
?>
<input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response">
<script>
document.addEventListener('DOMContentLoaded', function() {
var commentForm = document.getElementById('commentform');
if (commentForm) {
commentForm.addEventListener('submit', function(e) {
var recaptchaInput = document.getElementById('g-recaptcha-response');
// 如果隐藏字段中已经有 token,说明已经获取过了,直接放行提交
if (recaptchaInput.value !== '') {
return true;
}
// 阻止表单的默认提交行为
e.preventDefault();
// 调用 Google 服务生成 Token
grecaptcha.ready(function() {
grecaptcha.execute('<?php echo esc_js($site_key); ?>', {action: 'comment_submit'}).then(function(token) {
// 将生成的 Token 赋值给隐藏字段
recaptchaInput.value = token;
// 重新触发表单提交
commentForm.submit();
});
});
});
}
});
</script>
<?php
}
// 3. 在服务器端拦截评论请求,验证 Token 并判断分数 (Score)
add_filter( 'preprocess_comment', 'custom_verify_recaptcha_v3_token' );
function custom_verify_recaptcha_v3_token( $commentdata ) {
$secret_key = '你的_SECRET_KEY';
// 检查是否接收到了 Token
if ( ! isset( $_POST['g-recaptcha-response'] ) || empty( $_POST['g-recaptcha-response'] ) ) {
wp_die( '<strong>错误:</strong> 系统未能识别您的安全状态,请刷新页面重试。' );
}
$token = sanitize_text_field( $_POST['g-recaptcha-response'] );
$ip = $_SERVER['REMOTE_ADDR'];
// 向 Google 发送 POST 请求进行验证
$verify_url = 'https://www.google.com/recaptcha/api/siteverify';
$response = wp_remote_post( $verify_url, array(
'body' => array(
'secret' => $secret_key,
'response' => $token,
'remoteip' => $ip,
),
) );
// 网络请求错误处理
if ( is_wp_error( $response ) ) {
wp_die( '<strong>错误:</strong> 验证服务连接失败,请稍后再试。' );
}
$body = wp_remote_retrieve_body( $response );
$result = json_decode( $body );
/**
* Google reCAPTCHA v3 返回的 score 范围是 0.0 到 1.0
* 1.0 表示非常可能是人类,0.0 表示极大概率是机器人
* 官方建议的默认拦截阈值是 0.5
*/
$threshold = 0.5;
// 验证失败,或者分数低于安全阈值
if ( ! $result->success || $result->score < $threshold ) {
// 你可以把 $result->score 打印出来,方便前期调试机器人识别的严格程度
wp_die( '<strong>错误:</strong> 人机验证未通过,系统判定存在风险 (Score: ' . esc_html($result->score) . ')。如果您是真实访客,请联系管理员。' );
}
// 验证通过,放行评论
return $commentdata;
}
部署后的关键注意事项:
- JS ID 的匹配: 这段代码默认监听的是 ID 为
commentform的表单(这是 WordPress 默认的标准 ID)。如果你的主题自定义了评论表单的 ID,请将代码 JS 部分的document.getElementById('commentform')替换为你实际的表单 ID。 - 隐藏的右下角徽标: 虽然是无感验证,但 Google 默认会在页面右下角显示一个小的 reCAPTCHA 图标。如果你想隐藏它(需确保在表单附近保留 Google 的隐私政策链接以合规),可以在主题的 CSS 中添加:
.grecaptcha-badge { visibility: hidden; }