WordPress 过滤垃圾评论
用WordPress写博客一段时间,垃圾评论不断涌现在审批后台,看着比较烦人。简单的做了一下设置,能比较有效地过滤了大多数垃圾评论,记录分享下。
我的博客目前使用的wp 主题是nisarg,所以用nisarg为例,其他主题也差不了多少,几种方法如下:
1、设置黑名单过滤
在后台管理,进入“Settings”->“讨论”,里面有个“评论黑名单” 选项,该选项说明是:当评论的内容、姓名、URL、电邮或IP中包含以下文字,它将被移入回收站。每行输入一个词或IP地址。它也会在单词内部进行比对,所以“press”将会匹配“WordPress”。这个较为易懂,设置后,符合规则的评论会被自动移到回收站。
若垃圾评论还能过进入后台(回收站),看着还是挺烦的。对此,我们可以手工加上一些代码,直接对黑名单关键词进行过滤。
打开wp 的根目录下的/wp-content/themes/nisarg/functions.php 这个文件(或者进入后台管理里面进入“外观”-> “编辑”,找到functions.php文件),在该文件后面增上如下代码:
add_filter('preprocess_comment', 'filter_rubbish');
//禁止垃圾评论提交到数据库
function filter_rubbish($comment) {
if(is_user_logged_in()){ return $comment;} //登录用户不检测评论
if(wp_blacklist_check($comment['comment_author'],
$comment['comment_author_email'],
$comment['comment_author_url'],
$comment['comment_content'],
$comment['comment_author_IP'],
$comment['comment_agent'] )) {
header("Content-type: text/html; charset=utf-8");
wp_die('您评论包含辱骂,过激或其他原因,违反博客评论规则,如有疑问请联系管理员(yuccnx#gmail.com)处理!返回文章页');
}
return $comment;
}
代码较为简单,由于发垃圾评论的一般都为非登录的用户,所以仅对非登录用户,如果评论的作者名、邮箱、ip等如果在黑名单内的,直接die 掉。效果如下:
2、设置非中文过滤
按照上述1 的设置后,后台陆续还有很多垃圾评论,而且其中大部分都是全英文的,想了下,自己的小站,应该不会有什么老外留言。通过增加下面的过滤逻辑,纯英文的不给予通过,代码如下:
add_filter('preprocess_comment', 'filter_rubbish');
//禁止垃圾评论提交到数据库
function filter_rubbish($comment) {
// …… 这里代码和 1)内的一样,只是增加下面else 逻辑代码
else {
$pattern = '/[一-龥]/u';
if (!preg_match($pattern, $comment['comment_content'])) {
wp_die('不支持纯英文留言(input Chinese word!)');
}
}
return $comment;
}
人气广的博主,粉丝应该不乏老外,所以对于人气较广的博主该方法不适用。
3、简单的验证码
通过1和2,垃圾评论少了很多,但是时不时还会出现一些讨厌的垃圾评论,看其特征,这些评论都是机器人再群发的。对此,简单设置个验证码,可以拒之门外。
这里不设置图片那样相对复杂的验证码,通过简单的一个算数题,加上两个input 标签,一个用于给用户输入,一个隐藏的样式,自动填上结果。在用户提交时候后,不把数据填充在session或cookie内,只是简单检测两个input 的数据是否一样即可,较为简单和方便,而且也节省资源。实现步骤如下:
1)找到comment-template.php(我的服务器环境该文件在wp 根下的wp-includes/comment-template.php),找到函数function comment_form,在里面加上下面代码:
……
$rand1 = rand(11,99);
$rand2 = rand(11,99);
……
'code' => '<p><label for="code">验证码<span class="required">*</span>    ' . $rand1 . '+' . $rand2 . '=? </label> <input id="code" name="code" type="text" placeholder="输入上面算术结果" size="30" maxlength="100" aria-describedby="code-notes" required=\'required\' /><input type="hidden" id="hcode" name="hcode" size="30" maxlength="100" value=' . ($rand1 + $rand2) . ' /></p>',
如图位置对应的代码
2)再回到上面的functions.php 文件内,对add_filter 进行修改 ,加上验证码检测的逻辑即可。综上上面 的代码,最后functions 内加上的代码是这样(注意check_code 代码):
// 验证码检测
function check_code() {
$code = (isset($_POST['code'])) ? $_POST['code'] : null;
$hcode = (isset($_POST['hcode'])) ? $_POST['hcode'] : null;
if (empty($code)) {
wp_die('错误: 请输入验证码');
}
if ($code != $hcode) {
wp_die('错误: 验证码不正确');
}
}
//禁止垃圾评论提交到数据库
function filter_rubbish($comment) {
if(wp_blacklist_check($comment['comment_author'],
$comment['comment_author_email'],
$comment['comment_author_url'],
$comment['comment_content'],
$comment['comment_author_IP'],
$comment['comment_agent'] )) {
header("Content-type: text/html; charset=utf-8");
wp_die('您评论包含辱骂,过激或其他原因,违反博客评论规则,如有疑问请联系管理员(yuccnx#gmail.com)处理!返回文章页');
}
else {
$pattern = '/[一-龥]/u';
if (!preg_match($pattern, $comment['comment_content'])) {
wp_die('不支持纯英文留言(input Chinese word!)');
}
}
return $comment;
}
function pre_process_comment($comment)
{
if(!is_user_logged_in()){
check_code();
filter_rubbish($comment);
}
return $comment;
}
add_filter('preprocess_comment', 'pre_process_comment');
上面几种方法,可以拆开来单独设置其中之一,我的博客就是综合上面三种方法做过滤。一般的机器人爬虫群发器的垃圾评论,这样设置能够过滤了。但对人气较高的大站,这样远远不够,应该使用更为完善的过滤机制。
(全文完)
(欢迎转载本站文章,但请注明作者和出处 云域 – Yuccn )