昨天搞了WordPress防止垃圾评论免插件代码版,最后提到一种添加验证码的方法没有测试成功,但我是有点强迫症的人,别人都弄成功了,凭什么我搞不定?必须搞定,即使我不一定要使用。于是开始了漫长的搜索与测试。测试的时候还是有思路的,想了几种不成功的原因,一是代码冲突,二是代码里用的函数对今日杂记使用的主题不一定有效,三是在comments.php里插入代码的位置不对。本人以为第三种原因是最不可能的原因,因为只是放的位置不同而已,代码是肯定有效的,最后才发现,个人认为最不可能的原因才是真正的原因。放代码的位置下面会注意提到。
有两种验证码方式,一是数学加法验证码,二是随机数字验证码。
一、数学加法验证码,该方法随机生成两个数字,数字之和为验证码。
1、把以下代码添加到主题的function.php里。
//数学加法验证码
add_action('comment_form', 'spam_protection_math', 1, 1);
function spam_protection_math(){
//获取两个随机数, 范围0~9
$num1=rand(0,9);
$num2=rand(0,9);
//最终网页中的具体内容
echo "<p class='comment-form-author'><input type='text' name='sum' class='math_textfield' value='' size='25' tabindex='4'> $num1 + $num2 = ?"
."<input type='hidden' name='num1' value='$num1'>"
."<input type='hidden' name='num2' value='$num2'>"
."<label for='math' class='small'> 验证码</label></p>";
}
function spam_protection_pre($commentdata){
$sum=$_POST['sum'];//用户提交的计算结果
switch($sum){
//得到正确的计算结果则直接跳出
case $_POST['num1']+$_POST['num2']:break;
//未填写结果时的错误讯息
case null:wp_die('错误: 没有输入验证码,请输入验证码.');break;
//计算错误时的错误讯息
default:wp_die('错误: 验证码错误,请输入正确的验证码.');
}
return $commentdata;
}
if($comment_data['comment_type']==''){
add_filter('pre_comment_on_post','spam_protection_pre');
}
2、这样添加代码后可以直接使用,无需再往comments.php文件里添加任何代码,验证码输入框的位置在文章输入框的下面,这比较适合小白用户。更新:可以将“add_action('comment_form', 'spam_protection_math', 1, 1);”替换为“add_action('comment_form_after_fields', 'spam_protection_math', 1, 1);”,这样验证码的输入框就出现在网址输入框的下方,比较美观一些,配合自己的主题再修改下CSS,可以更完美,具体效果可以参考今日杂记下面的评论区。
3、如果嫌弃上面的代码添加的代码输入框位置不够好,可以在“//数学加法验证码”下面的“add_action”前面加两根半角的斜线,然后将<?php spam_protection_math() ?>添加到主题comments.php文件评论框合适的位置,正是这个合适的位置,把我搞得吐血,这个合适的位置范围是“comment_form()”函数范围之内,在其他位置添加后验证码不会起作用。
二、 随机数字验证码,该方法随机生成四位数字,四位数字为验证码。
1、把下面的代码添加到主题的function.php里。该方法来源于此,这里要感谢下文章的作者,正是找到这个方法,才让我发现验证码不起作用的真正原因。
// ADD: Anti-spam Code
function olo_antispam(){
if(!is_user_logged_in()){
//$pcodes = substr(md5(mt_rand(0,99999)),0,4); //验证码为英文+数字组合
$pcodes = substr(mt_rand(0,99999),0,4); //验证码为数字组合
$str = '<p class="olo_anti">';
$str .= '<label for="subpcodes">'.__('Anti-spam Code', 'olo').':</label>';
$str .= '<input type="text" size="4" id="subpcodes" name="subpcodes" />';
$str .= '<span class="pcodes">'.$pcodes.'</span>';
$str .= '<input type="hidden" value="'.$pcodes.'" name="pcodes" />';
$str .= '</p>';
echo $str;
}
}
add_action('comment_form', 'olo_antispam', 1, 1);
function yanzhengma(){
if ( !is_user_logged_in() ) {
$pcodes = trim($_POST['pcodes']);
$subpcodes = trim($_POST['subpcodes']);
if((($pcodes)!=$subpcodes) || empty($subpcodes)){
wp_die( __('错误提示:请输入正确的验证码。') );
}
}
}
add_filter('pre_comment_on_post', 'yanzhengma');
2、如上面数学加法验证码的第3步,如果嫌弃上面的代码添加的代码输入框位置不够好,可以在“add_action”前面加两根半角的斜线,然后将<?php olo_antispam() ?>添加到主题comments.php文件评论框合适的位置,同样这个合适的位置范围是“comment_form()”函数范围之内,在其他位置添加后验证码不会起作用。更新:和上面一样,可以将“add_action('comment_form', 'olo_antispam', 1, 1);”替换为“add_action('comment_form_after_fields', 'olo_antispam', 1, 1);”,这样验证码的输入框就出现在网址输入框的下方,比较美观一些。
我选择的数字加法验证码,心里作用认为该方法强一些,其实能破解随机数字验证码的垃圾评论机器人,估计破解简单的数字加法验证码也没有问题。昨天弄的WordPress防止垃圾评论免插件代码版效果很好,目前为止禁用Akismet后没有收到一条垃圾邮件,在配合上这个验证码估计效果更无敌。
如果用插件,哪个好?
这还真把我问到了,除了默认的Akismet,其他插件都没有用过,其实用代码挺好的,这两天一条垃圾评论都没有,推荐你也使用代码。