【WordPress】PHPでログイン画面にダミーの入力項目を作成して、認証に利用する

  • 投稿 : 2016-11-21
ソースを読み切れてないので、自己責任で!!
wp-login-guard01.png

・ログイン画面に、ダミーの入力項目を作成する
・ダミーの入力項目に、何か入力されているとエラーにする

こんな感じの動作をするプラグインを作成してみました。

<?php
/*
Plugin Name: login guard
Version: 0.1
Plugin URI: 
Description: 
Author: sample
Author URI: 
*/
add_filter('login_form','login_guard_login_form');
add_filter( 'wp_authenticate_user', 'login_guard_authenticate_username_password', 9, 3);

function login_guard_authenticate_username_password($user, $username, $password) {

    //入力が空でなければエラーにする
    if (!empty($_POST['dummy_code'])) {
        $error = new WP_Error();

        $print_error = __('ERROR', 'login_guard');
        $empty_captcha = __('ERROR', 'login_guard');
        $error->add('login_guard', "<strong>$print_error</strong>: $empty_captcha");

        return $error;
    }
    return $user;
}


function login_guard_login_form() {

$ouput = <<< EOF
<p><label><br>
5 + 6 = <input id="dummy_code" name="dummy_code" class="input" type="text" size="10" value=""/>
</label>
</p>
<br />
EOF;
  echo $ouput;

  return true;
}

少し動作させた限りでは大丈夫そうな雰囲気です。

認証関係の部分

wp_authenticate_userなんですが、/wp-includes/user.phpの「function wp_authenticate_username_password($user, $username, $password) 」の中でapply_filtersされてます。

$user = apply_filters( 'wp_authenticate_user', $user, $password );
if ( is_wp_error($user) )
	return $user;
このあたりのソースを読む限りでは、パスワードなどの認証が終わった後に、これが呼び出されて、WP_Errorオブジェクトを返すと認証エラーとして処理されるようになっています。この仕組みに乗っかるのが一番簡単そうに思います。

ソースを見てみたプラグイン

SI CAPTCHA Anti-Spam — WordPress Plugins
Captcha by BestWebSoft — WordPress Plugins

主に1つめのソースを少し読んで、結局、Wordpressの/wp-includes/user.phpを見てみました。
スポンサーリンク