FuelPHP で WordPress のログイン機能を使うの続きです。
WordPress では、wp_login_form()関数が用意されていて、wp-login.php 以外の場所からログイン操作できるようになります。ログイン後、元のページに戻ることができます。しかし、ログイン失敗時には wp-login.php にリダイレクトされます。ログイン失敗時のリダイレクト先を変えることができないか?と調べてみました。
公式フォーラムの過去ログ Can you stop wp_login_form redirecting to wp-login on fail? に掲載されていました。元は How to Redirect WordPress Failed Logins かららしいです。
add_action( 'wp_login_failed', 'my_front_end_login_fail' ); // hook failed login
function my_front_end_login_fail( $username ) {
$referrer = $_SERVER['HTTP_REFERER']; // where did the post submission come from?
$redirect = 'http://127.0.0.1/index.php/welcome/login/failed'; // URL when login failed
//if there's a valid referrer, and it's not the default log-in screen
if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') ) {
wp_redirect( $redirect );
exit;
}
}
WordPress のアクションフック機能を使って、ログイン失敗時の処理を変更することができました。(wp_login_failed フック自体は、wp-includes/pluggable.php にあります。ログイン処理をカスタマイズしている場合、上述のコードを記述しても希望する動作にならないかもしれません。)
FuelPHP 側では、失敗時の処理をするコントローラを追加します。(デフォルトの welcome.php に追加する場合です。)
public function action_login($failed)
{
$view = View::forge('welcome/index');
$loginform = wp_login_form(array('echo' => false));
if ('failed' == $failed)
{
$loginform .= '<p>ログインに失敗しました</p>';
}
$view->set_safe('loginform',$loginform);
return $view;
}
Selenium でのテストコードです。 https://gist.github.com/4028788 FuelPHP を http:/127.0.0.1/ に、WordPress を http://127.0.0.1/wordpress にインストールした場合です。WordPress のユーザーアカウントは、ユーザー名 testuser1 パスワード testpass1 です。