WordPress 过滤垃圾评论

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 掉。效果如下:

wp 过滤垃圾评论

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>&nbsp&nbsp&nbsp&nbsp' . $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

发表回复

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