wordpressのマルチサイトでは各ブログ専用のログイン画面が用意されている
他ブログのログイン画面からログインした場合にリダイレクトしてログイン先を正規化
wordpressのマルチサイトをサブドメイン構成で利用している。
サブドメインのマルチサイトなので、
test.com
というルートが存在し、ブログを開設するたびに、
sub1.test.com
sub2.test.com
という感じでブログが増えていく。それぞれのブログが専用のログインフォームを持っている構成になる。そして、各ブログの管理者アカウントで試してみたところ、sub1.test.comのadministratorがsub2.test.comのログインフォームからログインできるのがwordpressマルチサイトの標準の仕様になっている。
ただし、異なるブログのログイン画面からログインすることはできるものの以下の画面に遷移され、管理画面のダッシュボードが表示されるわけではない。
[ダッシュボードを表示]というリンクをクリックすることでログインしたユーザー専用のブログ管理画面へと移動することができるようになっている。
不特定多数のユーザーが利用するブログサービスをマルチサイト環境で開発しようとした場合に上のような仕様だとユーザーが混乱する可能性があるので、ログイン後のリダイレクト先を正規化することでログイン後の挙動を制御してみた。
ログイン後のアクションフックはwp_login
wp_loginでフックすればリダイレクト先を変更できる。具体的には以下のようになる。add_actionの設定は以下のようにプラグインのconstructに指定する。
add_action('wp_login', array($this, 'redirect_blog_home'), 10, 2);
redirect_blog_homeは以下のようにした。
function redirect_blog_home($user_login, $user) { if( $user->ID == "1" ) { // 特権管理者の場合はスルー } else { // ログインユーザーのブログドメインを取得 global $current_user; get_currentuserinfo(); $user_info = get_userdata($user->ID); $blog_details = get_blog_details($user_info->primary_blog); // リファラにユーザーのブログドメインが含まれていない場合 if( strpos($_SERVER["HTTP_REFERER"], $blog_details->domain) === false ) { // 管理画面トップへリダイレクト wp_redirect( 'http://'.$blog_details->domain.'/wp-admin/', 302 ); exit(); } } }
上のようにマルチサイト初期化プラグインに設定することで画像のメッセージ画面に遷移せず、リダイレクト先の正規化を行うことが可能となる。ただし、HTTPリファラについては値が無い状態も考えられる。その場合には、リファラが存在しない場合も正規化したリダイレクト処理を実行すれば画像のメッセージ画面に遷移しないで済む。