最近醉风云博客主站遭受很多英文垃圾评论,每个几天就有上千条,很烦。
开启评论审核 ≠ 阻止数据库写入,这正是 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>';
}
本文固定连接:https://code.zuifengyun.com/2026/04/3619.html,转载须征得作者授权。