博客 / WordPress/ 无需插件:通过代码实现 WordPress 防垃圾评论的完整方案

无需插件:通过代码实现 WordPress 防垃圾评论的完整方案

无需插件:通过代码实现 WordPress 防垃圾评论的完整方案

非插件实现 WordPress 防垃圾评论的方法

在 WordPress 中,垃圾评论是一个常见问题。虽然可以使用插件来解决,但通过代码实现可以更好地控制逻辑、减少插件依赖并提升性能。以下是一个通过修改主题的 functions.php 文件来实现的防垃圾评论方案。

核心代码实现

将以下代码添加到当前主题的 functions.php 文件中:

add_action('preprocess_comment', 'custom_preprocess_comment');
function custom_preprocess_comment($commentdata) {
    // 获取评论数据
    $comment_post_ID = $commentdata['comment_post_ID'];
    $comment_content = $commentdata['comment_content'];
    $comment_author = $commentdata['comment_author'];
    $comment_author_email = $commentdata['comment_author_email'];
    $comment_author_url = $commentdata['comment_author_url'];
    $comment_author_IP = $commentdata['comment_author_IP'];
    $comment_agent = $commentdata['comment_agent'];

    // 1. 验证 Nonce 防止跨站请求伪造 (CSRF)
    $nonce = wp_create_nonce('comment_nonce_' . $comment_post_ID);
    if (!isset($_POST['comment_nonce']) || $_POST['comment_nonce'] !== $nonce) {
        wp_die('评论请求无效,请刷新页面后重试。');
    }

    // 2. 检查评论内容是否包含中文字符(可选规则)
    if (!preg_match('/[x{4e00}-x{9fa5}]+/u', $comment_content)) {
        wp_die('评论内容需包含至少一个中文字符。');
    }

    // 3. 检查是否在 WordPress 黑名单中
    if (wp_blacklist_check($comment_author, $comment_author_email, $comment_author_url, $comment_content, $comment_author_IP, $comment_agent)) {
        wp_die('您的评论内容触发了垃圾评论规则。');
    }

    // 4. 要求用户必须登录才能评论(可选规则)
    if (!is_user_logged_in()) {
        wp_die('请先登录后再发表评论。');
    }

    // 5. 过滤评论内容中的 HTML 标签,防止 XSS 攻击
    $commentdata['comment_content'] = strip_tags($comment_content);

    return $commentdata;
}

代码功能说明

  • Nonce 验证:为每个评论表单生成一个唯一令牌,防止恶意机器人或 CSRF 攻击提交评论。
  • 中文内容检测:通过正则表达式要求评论必须包含中文字符,可有效过滤纯英文或符号的垃圾评论。此规则可根据需要调整或移除。
  • 黑名单检查:调用 WordPress 内置的 wp_blacklist_check() 函数,根据后台“讨论”设置中的黑名单进行过滤。
  • 登录要求:限制仅登录用户可评论,适用于会员制或高安全性要求的网站。
  • HTML 标签过滤:使用 strip_tags() 移除评论内容中的所有 HTML 标签,增强安全性。

前端表单集成

上述代码中的 Nonce 验证需要在评论表单中添加一个隐藏字段。请在主题的评论模板文件(通常是 comments.phpsingle.php 中的评论部分)中添加以下代码:

<?php
    $nonce = wp_create_nonce('comment_nonce_' . get_the_ID());
    echo '<input type="hidden" name="comment_nonce" value="' . esc_attr($nonce) . '" />';
?>

将其放置在 <form> 标签内、提交按钮之前即可。

注意事项与优化建议

  1. 规则定制:上述规则(如要求中文、必须登录)较为严格,请根据您的网站实际情况进行调整或注释掉不需要的规则。
  2. 错误提示wp_die() 会直接终止并显示错误信息。您可以通过 CSS 或钩子自定义错误页面的样式。
  3. 性能考虑:此方法在服务器端进行验证,对性能影响极小。如果评论量极大,可考虑结合缓存或更复杂的规则。
  4. 兼容性:代码适用于 WordPress 5.0 及以上版本,建议在子主题中进行修改,避免主题更新时被覆盖。

提示:在修改任何主题文件前,请务必备份。您也可以先将代码片段添加到“代码片段”管理插件中进行测试。

通过以上方法,您可以在不安装额外插件的情况下,为 WordPress 网站构建一个有效、可定制的防垃圾评论系统。

  1. 这个不错。

    1. avatar
      老牛博客

      用了它 可以不用Akismet

回复 屠龙 取消回复

您的邮箱不会公开。必填项已用 * 标注。