2026年5月20日
2026年5月20日
WordPressのユーザーセッション管理を改善する方法
はじめに
WordPressのログインセッションは「ログイン状態を保持する」チェックボックスの有無によって2日間または14日間持続します。セキュリティ要件に応じてセッション時間を調整したり、特定デバイスのセッションを強制終了する方法を解説します。
解決手順
ステップ1:セッション有効期限を変更する
// functions.php — セッション有効期限を変更
// auth_cookie_expiration フィルタで秒数を返す
// 「ログイン状態を保持する」ON時 → 1時間
add_filter('auth_cookie_expiration', function($expiration, $user_id, $remember) {
if ($remember) {
return 3600; // 1時間(デフォルト14日 = 1209600秒)
}
return $expiration; // チェックなし時はデフォルト(48時間)
}, 10, 3);
// セキュリティ強化:全ユーザー1時間に統一
add_filter('auth_cookie_expiration', fn() => 3600);
ステップ2:特定ユーザーの全セッションを無効化する
// 特定ユーザーの全デバイスからログアウトさせる
function logout_user_all_devices(int $user_id): void {
$sessions = WP_Session_Tokens::get_instance($user_id);
$sessions->destroy_all();
}
// 使用例:管理画面のボタンアクションなどから呼び出す
add_action('admin_post_force_logout_user', function() {
if (!current_user_can('edit_users')) {
wp_die('権限がありません');
}
$user_id = absint($_POST['user_id'] ?? 0);
logout_user_all_devices($user_id);
wp_safe_redirect(add_query_arg('loggedout', '1', wp_get_referer()));
exit;
});
ステップ3:現在のセッション一覧を取得・管理する
// 現在ログイン中のセッション情報を取得
function get_user_sessions(int $user_id): array {
$sessions = WP_Session_Tokens::get_instance($user_id);
return $sessions->get_all();
}
// セッション情報の内容例
// [
// 'expiration' => 1700000000, // Unixタイムスタンプ
// 'ip' => '203.0.113.10',
// 'ua' => 'Mozilla/5.0...',
// 'login' => 1699900000,
// ]
// 特定トークンを無効化
function revoke_session(int $user_id, string $token): void {
$sessions = WP_Session_Tokens::get_instance($user_id);
$sessions->destroy($token);
}
ステップ4:WP-CLIでセッションを管理する
# 特定ユーザーのセッションをすべて無効化
wp user session destroy --all --user=username
# 全ユーザーのセッションを一括無効化(サイト乗っ取り対策)
wp user list --field=ID | xargs -I{} wp user session destroy --all --user={}
# セッション有効期限を確認
wp eval "print_r(WP_Session_Tokens::get_instance(1)->get_all());"
注意事項
auth_cookie_expirationフィルタを短くしすぎると管理者も頻繁に再ログインが必要になります- セッションデータは
wp_usermetaテーブルにsession_tokensキーで保存されます wp_logoutアクションフックでセッション破棄の独自ロジックを追加できます
まとめ
セッション有効期限は auth_cookie_expiration フィルタで秒数を指定して変更します。不審なアクセスが疑われる場合は WP_Session_Tokens::get_instance($user_id)->destroy_all() で全デバイスからの強制ログアウトが可能です。