给 WordPress 的评论添加算术验证

   Updated: 2012-10-07 14:19       给 WordPress 的评论添加算术验证有 3 条评论

WordPress 中,我希望可以不填写名称和邮件地址也可以发表评论,但是这样垃圾评论就会变多,所以就要考虑再加一个验证的东西,比如图形验证、算术验证之类,相对来说使用算术验证,比较方便同时效果也不错。

网上的方法也很多,有使用插件比如 Math Comment Spam Protection(详细的中文介绍);有修改 wordpress 根目录下内核文件 wp-comments-post.ph 和主题文件 comments.php 的方法,这个方法如果更新 WordPress 程序后就失效了;还有修改主题的 functions.php 和 comments.php 文件的方法。这里介绍修改主题的 functions.php 和 comments.php 文件的方法,这个方法不用修改 WordPress 的内核文件,以后升级 WP 程序的时候不用再次改代码,比较方便些。

第一步:自定义一个算术验证函数。将以下函数代码添加到主题的 functions.php 文件中:

//自定义算术验证函数
function spam_protection_math(){
  //获取两个随机数, 范围 0~9
  $num1=rand(0,9);
  $num2=rand(0,9);
  //最终网页中的具体内容
  echo"<div class='row'>"
    ."<input type='text' name='sum' class='math_textfield' value='' tabindex='1'> $num1 + $num2 = ? "
    ."<input type='hidden' name='num1' value='$num1'>"
    ."<input type='hidden' name='num2' value='$num2'>"
	."<label for='math' >(为防 spam,提交评论之前必须做一道非常简单的算术题)</label>"
    ."</div>";

}
function spam_protection_pre($commentdata){
  $sum=$_POST['sum'];//用户提交的计算结果
  switch($sum){
    //得到正确的计算结果则直接跳出
    case $_POST['num1']+$_POST['num2']:break;
    //未填写结果时的错误讯息
    case null:err('Error: 请输入算术题的计算结果.');break;
    //计算错误时的错误讯息
    default:err('Error: 你输入的计算结果错啦,请重新输入.');
  }
  return $commentdata;
}
if(!is_user_logged_in() && $comment_data['comment_type']==''){
  add_filter('preprocess_comment','spam_protection_pre');
}

第二步:将自定义函数插入需要显示的位置。将以下代码添加到主题的 comments.php 文件中,可插入至需要显示算术验证框的位置,但需加在递交评论之前:

<?php if(!is_user_logged_in())spam_protection_math();?>

第三步:css 文件中指定算术验证框的属性,使之与当前主题搭配。根据实际的主题修改即可,我的主题使用如下属性:

input.math_textfield{font-size:100%; font-family:Verdana,Arial,Helvetica,Sans-serif; padding:0 0.1em;}
#respond{font-size:90%; padding:0 0.1em;}
#respond .row{margin:-1em 0 0 0;}
#respond .math_textfield{width:80px;}

以上内容主要参考为 WordPress 评论添加简单算术验证码,需要更详细的说明的也请看这篇文章。

参考链接:

  1. 为 WordPress 评论添加简单算术验证码
  2. 留言算术验证码插件 Math Comment Spam Protection

3 comments on “给 WordPress 的评论添加算术验证

  1. 忘想

    我有点疑问, 想问一下, 他的出错函数 err('Error: 你输入的计算结果错啦,请重新输入.'); 能不能也提供?

    Reply

发表回复

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