Loading
0

WordPress教程 阻止垃圾评论

领取优惠券买ECS云服务器有折扣

博客的后台是启用了Akismet并且所有留言设置了所有评论审核,即使这样Mysql中的评论表依然在不停的被刷呀刷呀刷的,新的comments ID上百倍于有效数据,于是希望在Akismet之前做一下过滤,思路是用JS动态在表单中增加一个校验串,评论提交到后台处理的时候提前检测一下这个校验串就可以知道这条评论是不是从前台手工提交的,然后也可以过滤一下明显的垃圾评论,例如不包含中文汉字的评论。

在主题的functions.php文件中加入判断的代码


//垃圾评论校验 http://www.thefox.cn/wordpress-spam-comment.shtml
function preprocess_comment_spam($commentdata){
  //管理员直接通过
  if (is_admin()) {
    return $commentdata;
  }
  //不包含英文拒绝
  if(!preg_match('/[一-龥]/u',$commentdata['comment_content'])){
    wp_die('错误:评论内容必须包含中文。');
  }
  //校验码错误拒绝
  if (!empty($_POST['comment_auth']) && $_POST['comment_auth'] == md5('E5X14f'.date("Y-/#/n"))) {
    return $commentdata;
  }else{
    wp_die('错误:您必须启用Javascritp才能发表评论。');
  }
}
add_action('preprocess_comment', 'preprocess_comment_spam');

这里过滤掉了非中文的评论,并且检查表单是否包含了comment_auth字段,如果是非IT博客也可以直接过滤掉http://这类的关键字。

前台的处理稍微麻烦些,首先必须确定已经引入jQuery和jQuery MD5插件,另外要找到评论表单的ID或class,这里以我的#commentform为例,在合适的位置中追加

//comment_spam
      $("#commentform").submit(function () {
       if ($("input#comment_auth").length==0) {
         var auth_date = new Date();
         var auth_key = $.MD5("E5X14f"+auth_date.getFullYear()+"-/#/"+(auth_date.getMonth()+1));
         var auth = "";
         $(this).append(auth);
       };
      });

其实这里的E5X14f其实略显多余了,小众使用的情况下是不会有评论机去专门计算你的算法的。