wordpress阻止任何形式的纯英文机器人

最近醉风云博客主站遭受很多英文垃圾评论,每个几天就有上千条,很烦。

开启评论审核 ≠ 阻止数据库写入,这正是 WordPress 的“设计缺陷”。垃圾评论虽然显示“待审核”,但实际上已经写入数据库,占用空间、拖慢网站、暴露漏洞。

在“写入数据库”时,WordPress 并没有真正的过滤机制。

看了一下相关的垃圾评论插件,没有更好的防英文功能,而且大多都收费。

自己写一下吧。

WordPress 原生不支持“基于语言过滤”,但我们可以通过多种方法在数据库写入前拦截。

将下述代码放到function.php中就可以。

/**
 * 在数据库写入前检查评论语言
 * 阻止全英文评论
 */
add_filter('preprocess_comment', 'block_english_comments_before_db');

function block_english_comments_before_db($commentdata) {
    $content = $commentdata['comment_content'];
    
    // 检测是否为全英文(排除标点符号和数字)
    $english_ratio = calculate_english_ratio($content);
    
    // 设置阈值:英文内容超过 90% 则阻止
    if ($english_ratio > 0.9) {
        wp_die(
            '<h3>评论被阻止</h3>' .
            '<p>本网站暂不接受全英文评论。请至少包含少量中文内容。</p>' .
            '<p><a href="javascript:history.back()">返回修改</a></p>',
            '评论语言不符合要求',
            403
        );
    }
    
    return $commentdata;
}

/**
 * 计算英文内容比例
 */
function calculate_english_ratio($text) {
    if (empty($text)) return 0;
    
    // 移除标点、数字、空格
    $clean_text = preg_replace('/[0-9\pP\s]/u', '', $text);
    if (empty($clean_text)) return 0;
    
    // 统计英文字符
    preg_match_all('/[a-zA-Z]/', $clean_text, $english_matches);
    $english_count = count($english_matches[0]);
    
    // 统计中文字符
    preg_match_all('/[\x{4e00}-\x{9fa5}]/u', $clean_text, $chinese_matches);
    $chinese_count = count($chinese_matches[0]);
    
    // 统计总字符数
    $total_count = mb_strlen($clean_text, 'UTF-8');
    
    // 如果只有英文,返回1
    if ($chinese_count == 0 && $english_count > 0) {
        return 1;
    }
    
    // 计算英文比例
    if ($total_count > 0) {
        return $english_count / $total_count;
    }
    
    return 0;
}

/**
 * 在评论表单添加语言提示
 */
add_action('comment_form_before', 'add_language_notice');
function add_language_notice() {
    echo '<div class="language-notice" style="background:#f0f8ff; padding:10px; margin:10px 0; border-left:4px solid #0066cc;">
        <strong>📢 评论语言要求:</strong>请确保评论中包含中文内容。全英文评论将被自动阻止。
    </div>';
}
加载中...
加载中...