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

wp_signon()
を使用した直後に is_user_logged_in()
が false
を返すことがありえます。これは、wp_signon()
の実行だけでは まだグローバルにログイン状態が反映されていないためです。
原因の概要
wp_signon()
は、ユーザー認証を行ってログイン処理を内部的に行いますが、
この関数は WordPress のグローバル変数 $current_user
や is_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
の確認もおすすめです