最近越來越多使用 WordPress 建站的小夥伴給網站加上了用户中心功能,並且開放了網站註冊,但是隨之而來的就是大量的機器註冊的垃圾用户,有些小夥伴非常機智的利用插件給註冊單表加上了驗證碼,有些小夥伴則想給註冊單表添加一個驗證問答,其實小編個人也推薦使用驗證問答,這樣對於某些限制註冊的網站非常適用,某些網站可能僅僅只開放給部分人羣,則可以僅僅將答案告訴那部分人羣即可,這樣的效果驗證碼顯然不能實現。先上一張效果圖:

將下面的代碼添加到主題的 functions.php 即可:

add_action( 'register_form', 'add_security_question' );
function add_security_question() { ?>
    <p>
    <label><?php _e('請輸入本站域名的中間部分:'v7v3') ?><br />
        <input type="text" name="user_proof" id="user_proof"  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' ] ) != v7v3' ) {
        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('中國的首都在哪裏?','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"  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) 。