博客的后台是启用了Akismet并且所有留言设置了所有评论审核,即使这样Mysql中的评论表依然在不停的被刷呀刷呀刷的,新的comments ID上百倍于有效数据,于是希望在Akismet之前做一下过滤,思路是用JS动态在表单中增加一个校验串,评论提交到后台处理的时候提前检测一下这个校验串就可以知道这条评论是不是从前台手工提交的,然后也可以过滤一下明显的垃圾评论,例如不包含中文汉字的评论。
在主题的functions.php文件中加入判断的代码
//垃圾评论校验 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 = "<input id="comment_auth" name="comment_auth" type="hidden" value=""+auth_key+"" />"; $(this).append(auth); }; }); |
其实这里的E5X14f
其实略显多余了,小众使用的情况下是不会有评论机去专门计算你的算法的。
一年多使用,完美的解决了垃圾评论的问题,评论机群发的消息一条也没有收到了。
你今年多大了?程序员的未来在哪里?
不知道这个真的有用没有
评论机器人发布不出去的,因为随机校验码是自己写的,除非你的网站非常知名,否则没有人专门为你的网站写规则
刚看了一下, 你也还是用wp-comments-post.php, 请忽略.
我这垃圾评论也不少,什么多说、akismet,都防不住,评论还都是中文,说的有模有样的。
你可以试试我的方法,截至目前为止,除了人工发送的没出现过垃圾评论,因为市面上的评论软件都提交不了. (PS 我并不知道是不是有正常留言被刷掉. 应该没有吧 呵呵)
我的akismet也是屏蔽了很多垃圾评论,我经常去清空就行吧,你这个是弄完了,就直接不接收那种评论了对吧
好像我的评论无法显示啊
博客有开评论审核,会有延迟。
用多说之类的工具也可以啊
学习了,我也是垃圾评论爆满,正在寻找有效方法解决····
呵呵,我说我评论都不见了,不过这个用户体验不好!非常不好!
[一-龥
大神,第一段代码里这个啥意思啊
[1-9] [A-Z]分别表示1到9的数字,A到Z的字母,这个能理解吧,[一-龥]的意思就是从一到龥的字符,基本上包含了所有常用的中文汉字。
大神,请教一个问题
你今年多大了?程序员的未来在哪里?
…我离大神还远呢,这么有深度的问题还没有资格回答呢。