WordPress で会員制のサイトを作成する場合など、
通常のログインページとは別に、専用のログイン画面を作ったりします。
この場合の ログインエラー の処理のお話です。
ログインエラー 時も専用ログイン画面へ戻したい
専用のログイン画面を作る場合、
ログイン処理自体は自作せず、デフォルトのログイン処理(wp-login.php)を使うのが一般的かと思います。
ですが、この場合、ログインに失敗した場合、
元いた専用ログイン画面ではなく、
デフォルトのWPのログイン画面へ飛ばされてしまいます。
これだと、会員ユーザ様には「???」と思わせてしまう可能性が高く、
ユーザ様には、常に最初にご案内した専用ログイン画面を利用してもらいたいものです。
というわけで、
今回はログインNGの場合の遷移をコントロールする方法をメモしておこうと思います。
ポイントは、エラーには2パターンあるという部分です。
ログイン処理の基本
今回扱うログイン処理はこのパターンです。
<form method="post" action="<?php echo wp_login_url(site_url('/my-login/')) ?>">
〜 入力欄などなど 〜
</form>
独自のデザインやslugを使って専用ログインページを作りますが。。。
ログイン処理自体は、デフォルトのログイン画面と同じところ(wp-login.php)へ投げて行います。
*ここでは仮にログイン画面もログイン後画面も「/my-login」とします。
ログインエラー は2種類
このログインフォームで、ログインエラーになるケースとしては、
大きく2つのパターンを考える必要があります。
①認証NG
ID/PWどちらも何かしら入力したものの、
認証処理を実行したら不一致だったというパターン
②空白入力
ユーザ名/パスワードどちらかが入力されておらず、
認証処理を実行する以前にNGというパターン
この2つです。
* ①は割とよく記載があるように思います。
以降、それぞれのパターンへの対応方法です。
どちらの場合も、function.phpでアクションフックを利用して、処理を追加します。
ログインエラー 対策-①認証NG
入力は確かにしたけど、認証で失敗する場合です。
この場合は、下記のアクションフックを利用します。
「login_failed」という名称の示すとおり、ログイン認証に失敗した場合の処理を追加できます。
add_action('wp_login_failed', 'my_login_failed');
function my_login_failed() {
wp_redirect('/my-login/?status=failed');
exit;
}
ログイン認証に失敗した場合には、先程いた「/my-login」画面へ、「status=failed」という情報を付けてリダイレクトさせます。
ログインエラー 対策-②空白入力
ユーザ名/パスワードどちらかが空白になっていた場合です。
この場合は、そもそも認証処理まで進みません。
このため上のwp_login_failed アクションフックまでたどり着つかず、
①の処理には当たりません。
ですので、この場合に対しては下記のアクションフックを利用し、
ログイン認証時に、処理を追加します。
add_action('wp_authenticate', 'empty_login', 1, 2);
function empty_login ($username, $pwd) {
if (empty($username) || empty($pwd)) {
wp_redirect('/my-login/?status=failed');
exit;
}
}
ユーザ名またはパスワードが空だった場合には、先程いた「/my-login」画面へ、「status=failed」という情報を付けてリダイレクトさせます。
独自のログイン画面が複数ある場合など
この場合には、
リダイレクト前にwp_get_referer()でリファラ情報を取得し、
振り分ければ良いですね。
//リファラを取得
$referer = wp_get_referer();
//リダイレクト先
$redirect_to = "";
if(strpos($referer,'my-login-2') !== false){
$redirect_to = "my-login-2";
}ele{
$redirect_to = "my-login";
}
wp_redirect($redirect_to.'/?status=failed');
また、管理者はデフォルトのログイン画面を使いたかったりするかもしれませんので、
それも同様に。。。
//WPのデフォルトログイン画面からの遷移でなければ。。。
if(strpos($referer,'wp-login') === false){
//戻り先を指定して、リダイレクト
}
といった書き方で切り分ければ大丈夫です。