【WordPress】wp_signon()でログインした後にis_user_logged_in()で条件分岐するとfalseになってしまう?

WordPressにログインしているはずなのですが、is_user_logged_in()で条件分岐するとfalseになってしまう状態についての対応法です。

wp_signon() を使用した直後に is_user_logged_in()false を返すことがありえます。これは、wp_signon() の実行だけでは まだグローバルにログイン状態が反映されていないためです。

原因の概要

wp_signon() は、ユーザー認証を行ってログイン処理を内部的に行いますが、
この関数は WordPress のグローバル変数 $current_useris_user_logged_in() の状態を即時に反映するわけではありません


解決方法

wp_set_current_user() を明示的に呼び出す

$user = wp_signon();

if (!is_wp_error($user)) {
    wp_set_current_user($user->ID); // ←これが必要
    wp_set_auth_cookie($user->ID);
    
    if (is_user_logged_in()) {
        // ここでは true になる
        echo 'ログイン済み';
    }
}
  • wp_set_current_user() → グローバル $current_user をセット
  • wp_set_auth_cookie() → ユーザーのログイン Cookie をブラウザに設定

よくある落とし穴

リダイレクト前にログイン確認している

ログイン後、リダイレクトせずにそのまま同一ページで is_user_logged_in() をチェックすると、Cookie の反映が間に合わず false になることがあります。

→この場合は、ログイン後に一度リダイレクトしてからチェックすることで正しく判定されます。

wp_redirect(home_url());
exit;

まとめ

  • wp_signon() の直後に is_user_logged_in() を使うなら、wp_set_current_user() もセットで使うこと
  • Cookie ベースのログイン状態反映にはリダイレクトが有効
  • ログイン判定でつまずくときは $current_user の確認もおすすめです