WordPressのSessionの仕組み

WordPressでsession_id()を実行しても値が返って来なかったので調査したときの覚書。

環境: PHP 7.4.19, WordPress 5.9.1

WordPressはPHPのsession_start()を使っていない。
おそらくPHPセッションが使えない環境でも動作するため。
だからCookieにPHPSESSIDは保存されないはず。
Cookie($_COOKIE)を使って自前でセッションを実装している。


WordPressが現在のユーザーを判定する仕組み

  • ログインしたときにwp_set_auth_cookie()でcookieにトークン書き込み。
    wp-includes\pluggable.php:904行目
  • このトークンをwp_user_metaのsession_tokensにも保存。
    wp-includes\class-wp-user-meta-session-tokens.php
  • ページを表示したときにwp_get_current_user()が実行。
    wp-includes\pluggable.php:69行目
  • apply_filters( 'determine_current_user', false )からwp_validate_auth_cookie()が実行されcookieの情報を参照。
    wp-includes\pluggable.php:681行目
  • cookieに書き込まれたユーザー名からユーザーIDを取得。
  • このユーザーIDのwp_user_metaのsession_tokens=cookieトークンならばログインユーザー。
一言でいうならWordPressはセッション管理を自前で行っている。

ここで気付いたのはWordPressはサーバーのsession設定と関係なく、cookieに書き込まれた時間でsession切れになる。
wp_set_auth_cookie()に記述されているのは

  • デフォルトで2日間
  • ログイン状態を保存するだと14日間
  • auth_cookie_expirationフィルターで設定変更できる

でも管理画面開きっぱなしで何もしていないと自動ログアウトしているような…。

この処理はまた後日調べる。


ゲストユーザーもセッションを使いたい場合

PHPのsession_start()を使う。
(簡単にセッション管理できるのがPHPの特徴の一つ)

ただしsession_status()で状態を確認してから。
参考: PHP: セッション関数 - Manual

セッションデータ保存パスに書き込み可能かどうかもチェック

is_writable(session_save_path())

session_start()後は$_SESSIONに値を書き込むとsession_save_path()のセッションIDファイルに保存され、同じセッション内で参照できるようになる。


【関連記事】