WordPressでは、ログインしたユーザーの権限(ロール)やユーザーIDに応じて、ログイン後の遷移先を変えることができます。管理者は管理画面へ、特定のユーザーは専用ページへ、といった出し分けに便利です。これは login_redirect フィルターで実現します。
この記事でわかること
login_redirectフィルターの基本(引数とWP_Errorの注意)- ロール(権限)別にリダイレクト先を変える
- ユーザーID別にリダイレクト先を変える
- 複数の条件を1つの関数にまとめる書き方
login_redirect フィルターの基本
login_redirect フィルターのコールバックは、$redirect_to(遷移先URL)・$request(要求された遷移先)・$user(ログインしたユーザー)の3つの引数を受け取ります。add_filter() の第4引数で 3 を指定するのを忘れないでください。
$user は失敗時に WP_Error になる
ログインに失敗すると
ログインに失敗すると
$user は WP_User ではなく WP_Error になります。$user->roles をいきなり参照するとエラーのもとなので、isset($user->roles) でガードしてから判定しましょう。ロール(権限)別にリダイレクト先を変える
例として、author(投稿者)ロールのユーザーを /author-page/ へリダイレクトします。該当しないユーザーは元の遷移先($redirect_to)をそのまま返します。
functions.php:authorロールを専用ページへ
function my_login_redirect($redirect_to, $request, $user) {
// ログイン失敗時(WP_Error)などロールが無ければそのまま返す
if (!isset($user->roles) || !is_array($user->roles)) {
return $redirect_to;
}
// author ロールなら専用ページへ
if (in_array('author', $user->roles, true)) {
return home_url('/author-page/');
}
return $redirect_to;
}
add_filter('login_redirect', 'my_login_redirect', 10, 3);
ユーザーID別にリダイレクト先を変える
特定のユーザーIDだけを別ページへ送ることもできます。次の例は、IDが 1 のユーザーを /special-page/ へリダイレクトします。
functions.php:ユーザーID=1を専用ページへ
function my_login_redirect($redirect_to, $request, $user) {
if (isset($user->ID) && $user->ID == 1) {
return home_url('/special-page/');
}
return $redirect_to;
}
add_filter('login_redirect', 'my_login_redirect', 10, 3);
複数の条件は1つの関数にまとめる
同じ関数名を複数定義しない
上記のコードはどれも
上記のコードはどれも
my_login_redirect という同じ関数名です。2つ以上をそのまま貼り付けると「関数の重複定義」で致命的エラーになります。複数のルールを使いたい場合は、1つの関数の中に条件をまとめて書いてください。ロール・ユーザーIDの条件をまとめた例です。上から順に判定し、最初に一致したリダイレクト先を返します。
functions.php:複数ルールを1つの関数にまとめる
function my_login_redirect($redirect_to, $request, $user) {
if (!isset($user->roles) || !is_array($user->roles)) {
return $redirect_to;
}
// 管理者かつ ID=1 の特別ユーザー
if (in_array('administrator', $user->roles, true) && $user->ID == 1) {
return home_url('/admin-special-page/');
}
// author ロール
if (in_array('author', $user->roles, true)) {
return home_url('/author-page/');
}
// 購読者はトップページへ
if (in_array('subscriber', $user->roles, true)) {
return home_url('/');
}
return $redirect_to;
}
add_filter('login_redirect', 'my_login_redirect', 10, 3);
権限の判定は has_cap でも
ロール名での判定(
ロール名での判定(
in_array)のほか、user_can($user, 'edit_posts') のように権限(capability)で判定することもできます。ユーザーのロールや権限の取得はユーザー属性を取得する方法、ロールごとの機能制限は特定ユーザーに管理画面の機能を制限する方法も参考になります。そのほかのリダイレクト・ユーザー制御
よくある質問(FAQ)
Qログイン後に表示するページを変えるには?
A
login_redirect フィルターを使います。add_filter('login_redirect', function ($url, $request, $user) { if (isset($user->roles) && user_can($user, 'manage_options')) { return admin_url(); } return home_url(); }, 10, 3); のように権限別に遷移先を返します。Q購読者(Subscriber)だけトップページへ送るには?
A
$user->roles に subscriber が含まれるかで判定します。if (isset($user->roles) && in_array('subscriber', $user->roles, true)) { return home_url(); } のように書き、それ以外は $redirect_to をそのまま返します。Qログアウト後のリダイレクト先を変えるには?
A
logout_redirect フィルターを使うか、add_action('wp_logout', function () { wp_safe_redirect(home_url()); exit; }); でログアウト後の遷移先を指定します。外部URLでなければ wp_safe_redirect() が安全です。まとめ
- 基本:
login_redirectフィルター(引数3つ・add_filter(..., 10, 3)) - 安全策:
isset($user->roles)で WP_Error をガード - 判定:ロールは
in_array('role', $user->roles, true)、IDは$user->ID - 注意:同じ関数名を複数定義しない(条件は1つの関数にまとめる)
WP_Errorのガードと関数名の重複に気をつければ、ユーザーごとのログイン後の導線を柔軟に設計できます。

