2026年11月6日

2026年11月6日

WordPressのCookieとセッションエラーを解決する方法

はじめに

WordPressにログインしても次のページでログアウト状態になる・「ログインしたままにする」チェックボックスを入れても翌日にはログアウトされる・サブドメイン環境でログインセッションが引き継がれない・COOKIE_DOMAINを設定したらログインが完全にできなくなった・セキュリティプラグインによるCookie検証が常に失敗するといった問題は、WordPressのCookie設定と認証の仕組みを正しく設定することで解決できます。

症状・原因

  • wp-config.phpのCOOKIE_DOMAINが現在のドメインと一致していない
  • COOKIEPATHやADMIN_COOKIE_PATHが正しくなく、管理画面とフロントエンドでCookieのパスが異なる
  • サーバーのシステム時刻がずれており、Cookieの有効期限判定がおかしい
  • HTTPSとHTTPが混在しており、セキュアCookieが非HTTPS経由で送信されない

解決手順

ステップ1:Cookie設定の状態を診断する

# 現在のCookie設定を確認
wp eval "
echo 'COOKIE_DOMAIN: '     . (defined('COOKIE_DOMAIN')     ? COOKIE_DOMAIN     : '未定義') . PHP_EOL;
echo 'COOKIEPATH: '        . (defined('COOKIEPATH')        ? COOKIEPATH        : '未定義') . PHP_EOL;
echo 'ADMIN_COOKIE_PATH: ' . (defined('ADMIN_COOKIE_PATH') ? ADMIN_COOKIE_PATH : '未定義') . PHP_EOL;
echo 'COOKIEHASH: '        . COOKIEHASH . PHP_EOL;
echo 'AUTH_COOKIE: '       . AUTH_COOKIE . PHP_EOL;
"

# サーバーの時刻を確認(Cookieの期限に影響)
wp eval "
echo 'Server time: ' . current_time('Y-m-d H:i:s') . PHP_EOL;
echo 'GMT time: '    . current_time('Y-m-d H:i:s', true) . PHP_EOL;
"

# ブラウザに保存されているCookieを確認(開発者ツール使用)
# Application → Cookies でwordpress_logged_in_XXX を確認

ステップ2:wp-config.phpのCookie設定を修正する

// wp-config.php: Cookie設定の修正

// ① 最もよくある問題: COOKIE_DOMAIN が設定されていて不一致
// 完全に削除するか、正しいドメインに設定する
// define('COOKIE_DOMAIN', 'example.com');  // ← 削除またはコメントアウト

// ② サブドメインでCookieを共有する場合
define('COOKIE_DOMAIN', '.example.com');  // 先頭に . をつける

// ③ サブディレクトリインストールの場合
define('COOKIEPATH',        '/wordpress/');
define('ADMIN_COOKIE_PATH', '/wordpress/wp-admin');
define('SITECOOKIEPATH',    '/wordpress/');

// ④ HTTPS環境でセキュアCookieを有効化
define('FORCE_SSL_ADMIN', true);  // 管理画面をHTTPSに強制
// wp-config.php はHTTPS検知の前に読み込まれるため
// プロキシ環境ではこちらも必要
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && 
    $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

// ⑤ ログイン持続時間をカスタマイズ
// デフォルト: ログイン保持なし=2日、あり=14日

ステップ3:ログイン持続時間をカスタマイズする

// 「ログインしたままにする」の持続時間を変更
add_filter('auth_cookie_expiration', function(int $length, int $user_id, bool $remember): int {
    if ($remember) {
        return 30 * DAY_IN_SECONDS;  // 30日間
    }
    return 8 * HOUR_IN_SECONDS;     // 8時間(ブラウザを閉じるまで)
}, 10, 3);

// Cookieが設定されたときのフック
add_action('set_auth_cookie', function(
    string $auth_cookie,
    int    $expire,
    int    $expiration,
    int    $user_id,
    string $scheme
): void {
    error_log("Auth cookie set for user {$user_id}, expires: " . date('Y-m-d H:i:s', $expire));
});

// Cookieが削除されたとき(ログアウト)のフック
add_action('clear_auth_cookie', function(): void {
    $user = wp_get_current_user();
    if ($user->exists()) {
        error_log("User {$user->ID} logged out at " . current_time('Y-m-d H:i:s'));
    }
});

ステップ4:セキュリティを強化したCookie設定

// ログイン Cookie にセキュリティヘッダーを追加
add_filter('send_auth_cookies', '__return_true');

// SameSite 属性を Strict に設定(CSRF対策)
add_filter('wp_auth_cookie_args', function(array $args): array {
    $args['samesite'] = 'Strict';
    return $args;
});

// 管理者のセッションを1箇所に制限(他端末からの同時ログインを無効化)
add_action('wp_login', function(string $user_login, WP_User $user): void {
    if ($user->has_cap('manage_options')) {
        // 全セッショントークンを削除して新しいセッションのみ有効に
        $sessions = WP_Session_Tokens::get_instance($user->ID);
        $sessions->destroy_others(wp_get_session_token());
    }
}, 10, 2);

// 指定期間アクティビティがなければセッションを終了
add_action('init', function(): void {
    if (!is_user_logged_in()) return;

    $last_active = get_user_meta(get_current_user_id(), 'last_active', true);
    $timeout     = 2 * HOUR_IN_SECONDS;  // 2時間でセッションタイムアウト

    if ($last_active && (time() - (int) $last_active) > $timeout) {
        wp_logout();
        wp_redirect(wp_login_url());
        exit;
    }

    update_user_meta(get_current_user_id(), 'last_active', time());
});

ステップ5:マルチサイトのCookie設定

// wp-config.php: マルチサイトでのCookie設定
define('MULTISITE',         true);
define('COOKIE_DOMAIN',     '');           // 空にして各ドメインに対応
define('ADMIN_COOKIE_PATH', '/');
define('COOKIEPATH',        '/');
define('SITECOOKIEPATH',    '/');

// サブドメイン型マルチサイトで全サブドメインでCookieを共有
// define('COOKIE_DOMAIN', '.example.com');  // これだとサブドメイン間でCookie共有

// カスタムドメインのサブサイトにログインしたときのCookieドメインを修正
add_filter('auth_cookie_domain', function(string $domain): string {
    // 現在のホストをCookieドメインとして返す
    return parse_url(home_url(), PHP_URL_HOST);
});

注意事項

  • COOKIE_DOMAINを設定した後にログインできなくなった場合は、まずブラウザのCookieを全削除してから再度ログインを試みてください。古いCookieが残っているだけの場合があります
  • wp-config.phpを変更すると既存のすべてのログインセッションが無効になります。本番環境では変更前にユーザーへの告知を検討してください

まとめ

WordPress CookieおよびセッションエラーはCOOKIE_DOMAIN・COOKIEPATH・ADMIN_COOKIE_PATHの設定を確認して修正します。解決は①wp evalでCookie定数を確認・サーバー時刻のズレ確認・ブラウザ開発ツールでCookieの実態確認、②COOKIE_DOMAINの不一致を解消・サブドメイン共有は.example.comと先頭にドット・サブディレクトリはCOOKIEPATHを変更・プロキシ環境は$_SERVER['HTTPS']を手動設定、③auth_cookie_expirationフィルターでログイン持続時間を調整・set_auth_cookieアクションでCookie設定をログ、④wp_auth_cookie_argsでSameSite=Strictを設定・WP_Session_Tokensで管理者の多重ログインを制限・アクティビティ監視によるセッションタイムアウト実装、⑤マルチサイトはCOOKIE_DOMAIN=''で各ドメインのCookieを使用・auth_cookie_domainフィルターでカスタムドメイン対応の手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲