WordPress 纯代码过滤英文、日文和包含链接的垃圾评论

WP 站长肯定都遇到过垃圾评论的问题,特别是那种全英文的,一个评论可能比文章还长,而且一来就是一群。

用插件是一个方法,Akismet 通过大数据能够拦截绝大多数垃圾评论,但是它的服务器在国外,国内站点启用之后,用户评论明显变慢,页面加载速度也受到影响。

既然已经知道常见垃圾评论的特征,我们就可以用轻便的方案针对性地解决。

一、禁止全英文,禁止包含日文

// 评论中需要有中文
function wp_refused_spam_comments($comment_data) {
$pattern = '/[一-龥]/u';
$jpattern = '/[ぁ-ん]+|[ァ-ヴ]+/u';
if (!preg_match($pattern, $comment_data['comment_content'])) {
wp_die(__('评论中需要有汉字!'));
}
if (preg_match($jpattern, $comment_data['comment_content'])) {
wp_die(__('不能有日文!'));
}
return ($comment_data);
}
add_filter('preprocess_comment', 'wp_refused_spam_comments');

二、禁止发链接

// 禁止发链接
function wp_comment_post( $incoming_comment ) {
$http = '/[href="|rel="nofollow"|http:\/\/|<\/a>]/u';
if(preg_match($http, $incoming_comment['comment_content'])) {
wp_die( "禁止发链接!" );
}
return( $incoming_comment );
}
add_filter('preprocess_comment', 'wp_comment_post');

经过本站使用,发现禁止链接的代码有时会把中英文混杂的文本误判为链接。建议添加代码后用不同场景测试,避免正常评论被拦截。

将代码放入主题的 function.php 文件中,推荐使用插件 Code Snippets 快捷插入代码片段,避免频繁编辑文件。此外,代码片段还能够导入导出,方便备份和多站点使用。

可以看到代码中提醒用户用的是 wp_die() 方法,网上有些代码使用的是 err() 方法。在实际测试中,我发现主题不支持 err() 方法,会导致 WordPress 提示“遇到致命错误”。虽然后者也能达到打击垃圾评论的作用,但普通用户无意间触发了条件却看到系统错误提示,必然会一脸懵逼,严重影响体验。

如果平时使用 WordPress APP 管理评论,管理员也会受到该代码的限制,有需要时可登录网页后台回复。

以上两段代码在网络上流传很广,暂不清楚它的真实出处,本文仅作为记录。

耕读君
耕读君

一个筋斗十万八千里,说明上云好啊

文章: 197

一条评论

  1. 尝试用过 Akimest 和 Antispam Bee,这两款都是鼎鼎有名的防垃圾评论插件,但又采用不同的机制。前者通过云端比对来判断是否垃圾评论,后者在本地通过评论特性来判断,这就导致不同的结果——Akimest 因国内“墙”的原因,有时候会造成网络阻塞;Antispam Bee 需要占用服务器计算性能,增加数据库负担。

    如果是国内的网站,发现垃圾评论大多数为外文,那么使用本文的代码可以拦截掉绝大多数垃圾评论,而且几乎不会有性能损失。能用代码解决问题就少用插件。

留下评论

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