外贸独立站的底层设计密码WordPress 成品站模板
当前位置:首页>WordPress建站>后台定制>WordPress 注册表单添加验证问题(支持多个随机问题)

WordPress 注册表单添加验证问题(支持多个随机问题)

通常网站的注册表单都使用验证码来进行验证,但是有没有考虑过使用验证问题来验证呢?使用问题验证的好处在于:防止机器人注册(和验证码一样),只有知道答案的人才能注册(可用于限制用户注册)。下面将添加一个验证问题:中国的首都是哪里?答案是个正常人都知道:北京。

security-question-wpdaxue_com

将下面的代码添加到主题的 functions.php 即可:

/**
 * WordPress 注册表单添加验证问题
 * https://www.wpdaxue.com/add-a-security-question-to-the-register-screen.html
 */
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>: 您的回答不正确。'  );
	}
}

注:第 8 行是问题,第 19 行是正确的答案。

如果你想限制用户注册,将问题和答案设置为只有某些人知道的即可(比如只在某个Q群告知)

2013-10-08 更新:

有朋友询问如何添加多个随机问题,感谢 @Rilun 提供了解决办法。

要实现多个随机问题,需要添加两个数组,分别存放着问题和答案,再增加一个两个函数都能取到的随机数(也就是在注册表单开始之前进行一个Session)即可。代码如下:

/**
 * WordPress 注册表单添加验证问题(支持多个随机问题)
 * https://www.wpdaxue.com/add-a-security-question-to-the-register-screen.html
 */
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('中国的首都在哪里?','Google是哪个国家的公司?');
// 添加答案数组(与上面的问题对应)
$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) ,更多说明,请参考 rand() 函数文档

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
欢迎关注WordPress大学公众号 WPDAXUE
后台定制

WordPress 自动为新文章添加已使用过的标签

2013-10-5 10:33:47

后台定制

去除仪表盘“概况”的WordPress版本信息

2013-10-7 7:47:00

15 条回复 A文章作者 M管理员
  1. bsu2000

    请教一下,站点使用了主题自带的注册和登陆页面,非系统界面,具体怎么安装验证问题的功能?已经试过,将代码添加到主题的 functions.php 里无任何效果,现在烦死了,每天都有大量的yahoo邮箱注册的垃圾账户,封IP也解决不了!

    • 倡萌

      请联系主题作者,他比较熟悉主题代码

  2. 第二个他忘写session_start()了

  3. 有没有在注册页面添加一个QQ邮箱是否订阅的功能呢?

  4. 多个问题的还有问题,得矫正一下

  5. 已添加问题,但是自定义的注册页面(露兜的那个)显示不出,如何添加到特定页面呢?

  6. 第一段正常。第二段随机的代码添加后,注册后台能正常显示问题,但是答案不论怎么填都是提示 错误: 您的回答不正确。
    请博主测试。

    • 我也碰到了同样的问题

    • 应该是答案也随机了

  7. 小呆

    这些代码添加到哪个文件里呢?函数文件还是注册模版文件?谢谢

    • 倡萌

      添加到主题的 functions.php 即可

    • 小呆

      嗯 谢谢 我的是自定义注册页面 我想要的效果是在我的注册页面里显示一个这样的验证,我想问我这样的代码应该怎么加?谢谢了

  8. Tokin

    怎么随机呢,表示不会PHP,哈哈

    • 倡萌

      我也不知道如何随机,但是设定一个问题即可,弄那么多干啥呢

    • 倡萌

      文章已经更新,可以支持多个随机问题啦

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索