给wordpress添加注册验证问答的小方法
最近网站每天都收到大量的以yahoo邮箱为后缀名的新用户注册,一看就是注册机搞的鬼。作为一名淳朴的代码搬运工,赶紧在网上搜索解决办法,发现有童靴非常机智的利用插件给注册单表加上了验证码,有些童靴则想给注册单表添加一个验证问答,清风抉择了半天,决定使用验证问答,这样对于某些限制注册的网站非常适用,特别是像《站长萌萌哒》这种只开放给站长群体的网站,则可以仅仅将答案告诉那部分人群即可,这样的效果验证码显然不能实现。于是赶紧把相关代码copy下来,鼓捣一番,效果图如下:
实现的方法很简单,把以下代码添加到主题的 functions.php即可。(注意:有些收费主题的functions.php写入后可能出错,请自行联系主题作者。)
add_action( 'register_form', 'add_security_question' ); function add_security_question() { ?> <p> <label><?php _e('你是注册机吗') ?><br /> <input type="text" name="user_proof" id="user_proof" class="input" size="25" tabindex="20" /></label> </p> <?php } add_action( 'register_post', 'add_security_question_validate', 10, 3 ); function add_security_question_validate( $sanitized_user_login, $user_email, $errors) { // 如果没有回答 if (!isset($_POST[ 'user_proof' ]) || empty($_POST[ 'user_proof' ])) { return $errors->add( 'proofempty', '<strong>错误</strong>: 您还没有回答问题。' ); // 如果答案不正确 } elseif ( strtolower( $_POST[ 'user_proof' ] ) != 不是' ) { return $errors->add( 'prooffail', '<strong>错误</strong>: 您的回答不正确。' ); } }
上面的代码只有一个验证问答,如果想实现多个随机问答,请使用如下代码。(注意:代码源自网络分享,本人使用该随机代码后,注册时始终提示回答错误,也懒得分析原因,就直接使用上面的单问答代码~)
function rand_reg_question(){ $register_number=rand(0,1); // 设置随机数的返回范围 $_SESSION['register_number']=$register_number; } add_action('login_head','rand_reg_question'); global $register_questions; global $register_answers; // 添加问题数组 $register_questions=array('你是外国人吗?','你是站长吗?'); // 添加答案数组(与上面的问题对应) $register_answers=array('不是','是'); add_action( 'register_form', 'add_security_question' ); function add_security_question() { global $register_questions; $register_number=$_SESSION['register_number']; ?> <p> <label><?php echo $register_questions[$register_number];?><br /> <input type="text" name="user_proof" id="user_proof" class="input" size="25" tabindex="20" /> </label> </p> <?php } add_action( 'register_post', 'add_security_question_validate', 10, 3 ); function add_security_question_validate( $sanitized_user_login, $user_email, $errors) { global $register_answers; $register_number=$_SESSION['register_number']; if (!isset($_POST[ 'user_proof' ]) || empty($_POST[ 'user_proof' ])) { return $errors->add( 'proofempty', '<strong>错误</strong>: 您还没有回答问题。' ); } elseif ( strtolower( $_POST[ 'user_proof' ] ) != $register_answers[$register_number] ) { return $errors->add( 'prooffail', '<strong>错误</strong>: 您的回答不正确。' ); } }
注:请编辑 14 和 16 行修改问题和答案,如果你修改了问题的数量,请记得修改第 6 行的 随机数返回范围 rand(0,1) ,比如 3 个问题,修改为 rand(0,2)。