【WordPress】ログイン後のリダイレクト先をユーザー別に変える方法|login_redirectで権限・IDごとに

【WordPress】特定ユーザーのログイン後に表示するページを変更する方法 WordPress

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 になる
ログインに失敗すると $userWP_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ログイン後に表示するページを変えるには?
Alogin_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->rolessubscriber が含まれるかで判定します。if (isset($user->roles) && in_array('subscriber', $user->roles, true)) { return home_url(); } のように書き、それ以外は $redirect_to をそのまま返します。
Qログアウト後のリダイレクト先を変えるには?
Alogout_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のガードと関数名の重複に気をつければ、ユーザーごとのログイン後の導線を柔軟に設計できます。