在 WordPress 中配置 Cloudflare Turnstile 是一个比传统 reCAPTCHA 更优雅、对用户更友好的解决方案。它无需用户进行任何交互(如点击),或者仅进行简单的复选框确认,能有效阻止垃圾信息的同时提升用户体验。
以下是两种主要的配置方法:使用插件(推荐给大多数用户)和手动代码集成(适合开发者)。

方法一:使用插件(*简单、*推荐)
这是*适合非开发者的方法。目前有几个优秀的插件可以让你在几分钟内完成配置。
推荐插件:
- Simple Cloudflare Turnstile: 轻量级、专注于此功能的插件。
- Advanced Google reCAPTCHA & Cloudflare Turnstile: 同时支持 reCAPTCHA 和 Turnstile。
- WP Turnstile: 另一个专门为 Turnstile 设计的插件。
这里以 Simple Cloudflare Turnstile 为例,因为它非常直观:
步骤 1:获取 Turnstile Keys
- 拥有一个 Cloudflare 账户(即使你的域名不在 Cloudflare 托管,也可以使用)。
- 登录 Cloudflare 仪表板,在侧边栏找到 “安全性” > “Turnstile”。
- 点击 “添加站点”。
- 填写你的网站信息:
- 网站名称: 你的 WordPress 网站名。
- 网站域名: 你的网站域名(例如
example.com)。 - 小部件模式: 推荐选择 “非交互式” 以获得*佳用户体验。
- 点击 “创建”。
- 成功后,你会得到一对密钥:站点密钥 和 秘密密钥。复制并保存它们。
步骤 2:安装并配置插件
- 在 WordPress 后台,进入 “插件” > “安装插件”。
- 搜索 “Simple Cloudflare Turnstile” 并安装、激活。
- 进入 “设置” > “Cloudflare Turnstile”。
- 将之前获取的 站点密钥 和 秘密密钥 分别填入对应字段。
- 在 “启用位置” 部分,选择你希望显示 Turnstile 的表单,例如:
- 登录表单
- 注册表单
- 忘记密码表单
- 评论表单
- WooCommerce 结账/登录/注册(如果适用)
- 保存更改。
完成!现在你选择的表单就会受到 Turnstile 的保护,而用户几乎感知不到它的存在。
方法二:手动代码集成(适合开发者)
如果你喜欢完全控制,或者你的主题/表单插件不被上述插件支持,可以手动添加代码。
步骤 1:获取 Turnstile Keys
同方法一的步骤 1,从 Cloudflare 获取你的 站点密钥 和 秘密密钥。
步骤 2:将 Turnstile 脚本和前端部件添加到表单
你需要将 Turnstile 的 JavaScript 脚本和占位符 div 添加到你的表单模板中。
将以下代码添加到你的主题的 functions.php 文件中,或者一个自定义功能插件中:
/**
* 在网站前台加载 Cloudflare Turnstile 脚本
*/
function enqueue_turnstile_script() {
// 仅在需要显示 Turnstile 的页面加载,如登录页、文章页(评论)
if is_page('login') || is_single() ) {
wp_enqueue_script('cloudflare-turnstile', 'https://challenges.cloudflare.com/turnstile/v0/api.js', array(), null, true);
}
}
add_action('wp_enqueue_scripts', 'enqueue_turnstile_script');
/**
* 在登录表单后添加 Turnstile 部件
*/
function add_turnstile_to_login_form() {
$site_key = '你的_站点_密钥'; // 替换为你的真实站点密钥
echo '<div class="cf-turnstile" data-sitekey="' . esc_attr($site_key) . '" data-theme="light"></div>';
}
add_action('login_form', 'add_turnstile_to_login_form');
/**
* 在评论表单后添加 Turnstile 部件
*/
function add_turnstile_to_comment_form() {
$site_key = '你的_站点_密钥'; // 替换为你的真实站点密钥
echo '<div class="cf-turnstile" data-sitekey="' . esc_attr($site_key) . '" data-theme="light"></div>';
}
add_action('comment_form_after_fields', 'add_turnstile_to_comment_form');
// 对于已登录用户,评论表单结构不同
add_action('comment_form_logged_in_after', 'add_turnstile_to_comment_form');
步骤 3:服务器端验证
这是*关键的一步。当表单提交时,你必须将 Turnstile 返回的令牌发送到 Cloudflare 进行验证。
以下是一个处理登录表单验证的例子:
/**
* 验证 Turnstile 响应
*/
function verify_turnstile_response($response_token) {
$secret_key = '你的_秘密_密钥'; // 替换为你的真实秘密密钥
$verify_url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
$post_data = array(
'secret' => $secret_key,
'response' => $response_token,
'remoteip' => $_SERVER['REMOTE_ADDR']
);
$response = wp_remote_post($verify_url, array(
'body' => $post_data,
));
$result = json_decode(wp_remote_retrieve_body($response), true);
return $result['success']; // 返回 true 或 false
}
/**
* 验证登录表单的 Turnstile
*/
function verify_login_turnstile($user, $username, $password) {
// 检查是否提交了 turnstile 响应
if (!isset($_POST['cf-turnstile-response'])) {
return new WP_Error('authentication_failed', __('<strong>错误</strong>: 请完成人机验证。'));
}
$token = sanitize_text_field($_POST['cf-turnstile-response']);
$verification = verify_turnstile_response($token);
if (!$verification) {
return new WP_Error('authentication_failed', __('<strong>错误</strong>: Turnstile 验证失败,请重试。'));
}
return $user;
}
// 在 WordPress 认证过程中加入我们的验证
add_filter('wp_authenticate_user', 'verify_login_turnstile', 10, 3);
对于评论表单,你可以使用 preprocess_comment 钩子进行类似的验证。
总结与*佳实践
| 特性 | 使用插件 | 手动集成 |
|---|---|---|
| 难度 | 简单,无需编码 | 复杂,需要开发知识 |
| 灵活性 | 中等,取决于插件选项 | 高,可以完全自定义 |
| 维护 | 由插件作者更新 | 自行负责更新 |
| 推荐用于 | 绝大多数网站管理员、博主 | 开发者、有特殊定制需求的网站 |
*佳实践:
- 保护密钥: 永远不要将你的秘密密钥暴露在前端代码中。
- 测试: 在 Cloudflare Turnstile 的设置中,你可以将域名添加到 “允许列表”,并为测试环境创建一个 “测试” 模式的站点,使用固定的测试密钥,这样验证总是成功或失败,便于开发。
- 备用方案: 考虑在 Turnstile 脚本加载失败时,提供一个备用的验证机制(虽然很少需要)。
- 样式: Turnstile 小部件可以自适应容器大小,你也可以通过 CSS 自定义其外观以匹配你的主题。
按照以上步骤,你就可以成功地在 WordPress 中配置 Cloudflare Turnstile,有效地保护你的网站表单免受垃圾邮件和机器人的侵扰。
