2026年5月20日
2026年5月20日
WordPressのログインがすぐ切れる原因と対処|Cookieの有効期限・Heartbeat・URLの不一致
WordPressの管理画面で、少し時間を空けただけでログイン画面に戻される、記事の編集中に「セッションの有効期限が切れています。前回行った操作の時点からまた続けるにはログインしてください。」という小窓が出る、といった症状の原因と対処を説明します。
対処の前に、WordPressのログインがどう保たれているかを知っておくと、原因を絞り込みやすくなります。
WordPressのログインの仕組み
WordPressのログインは、PHPのセッション(session_start() と session.gc_maxlifetime)を使っていません。次の2つで成り立っています。
- ログイン用のCookie:ログインするとブラウザーに
wordpress_logged_in_…と、管理画面用のwordpress_sec_…(HTTPSの場合。HTTPではwordpress_…)が保存されます。Cookieの中身は、ユーザー名・有効期限・セッションのトークンと、wp-config.phpのセキュリティキーを使った署名です - セッションのトークン:ログインごとのトークンが、データベースのユーザーのメタ情報(
session_tokens)に保存されます。Cookieのトークンがここに無ければ、ログインは無効になります
ログインの有効期間は、ログイン画面の「ログイン状態を保存する」にチェックしたかどうかで変わります(2026年10月時点のWordPress 7.1で確認)。
| ログイン時 | ログインの有効期間 | ブラウザーのCookie |
|---|---|---|
| 「ログイン状態を保存する」にチェックなし | 2日 | ブラウザーを閉じると消える(セッションCookie) |
| 「ログイン状態を保存する」にチェックあり | 14日 | 有効期間の終了まで残る |
そのため、php.ini の session.gc_maxlifetime を延ばしたり、PHPのセッションをRedisで共有したりしても、WordPressのログインには影響しません。
よくある原因と確認方法
| 症状 | 考えられる原因 |
|---|---|
| ブラウザーを閉じるたびにログアウトされる | 「ログイン状態を保存する」にチェックしていない |
| 長時間の編集のあと、保存で「辿ったリンクは期限が切れています。」と出る | Heartbeat(管理画面の定期通信)が止められていて、ログインの確認やnonceの更新が行われていない |
| 管理画面に入るとすぐログイン画面に戻る、ログインを繰り返す | サイトのURL(www の有無、http と https)の不一致、COOKIE_DOMAIN の誤り |
| 全員が同時にログアウトされる | wp-config.php のセキュリティキーが変わった |
| 複数のサーバーで動かしていて、ページを移動するたびにログアウトされたりされなかったりする | サーバーごとにセキュリティキーが違う |
| 一定時間操作しないとログアウトされる | プラグインの自動ログアウトやセッション制限の機能 |
| フロント側で、ログイン中なのに管理バーが出ない | ページキャッシュやCDNが、ログイン中の利用者にもキャッシュを返している |
以下、原因ごとに確認と対処を説明します。
1. 「ログイン状態を保存する」と有効期間
まず、ログイン画面で「ログイン状態を保存する」にチェックして試します。チェックしない場合、ログインのCookieはブラウザーを閉じると消えます。
それでも14日では短い場合は、auth_cookie_expiration フィルターで有効期間を変えられます。テーマを変えても効くよう、wp-content/mu-plugins/login-cookie-lifetime.php として置きます(mu-plugins ディレクトリが無ければ作成します)。
<?php
/**
* Plugin Name: Login cookie lifetime
* Description: 「ログイン状態を保存する」にチェックしたときのログインの有効期間を30日にする。
*/
add_filter(
'auth_cookie_expiration',
function ( $length, $user_id, $remember ) {
if ( $remember ) {
return 30 * DAY_IN_SECONDS;
}
return $length; // チェックなしは既定の2日のまま
},
10,
3
);
- 変更は、次にログインしたときから有効になります。いまのログインには影響しません
- チェックなしのときの値(
$rememberが false)を延ばしても、Cookie自体はブラウザーを閉じると消えます - 有効期間を長くするほど、共有のパソコンや紛失した端末でログインが残る危険が増えます。管理者アカウントでは長くしすぎないようにしてください
2. 編集中に切れる場合はHeartbeatを確認する
管理画面は、Heartbeat API(admin-ajax.php への定期的な通信)を使って、ログインが切れていないかを確かめ、投稿の編集画面では保存に使うnonce(一時的な合言葉)を新しいものに差し替えています。ログインが切れた場合は、画面を離れずにログインし直せる小窓が表示されます。
高速化やサーバー負荷対策のプラグインには、Heartbeatを止めたり、間隔を大きく延ばしたりする設定を持つものがあります。管理画面や投稿の編集画面でHeartbeatを止めていると、次のことが起こります。
- ログインが切れても小窓が出ず、保存した時点で初めて失敗に気づく
- nonceが更新されず、長時間(nonceの有効期間はおよそ12〜24時間)開いたままの画面から保存すると「辿ったリンクは期限が切れています。」と表示される
該当する設定がある場合は、少なくとも投稿の編集画面ではHeartbeatを止めないように変更してください。
3. サイトのURLとCookieの設定を確認する
ログインのCookieは、ログインしたときのホスト名(例:www.example.com)とパスに対して保存されます。WordPressの設定上のURLと実際にアクセスするURLが食い違っていると、ログインしたはずなのにCookieが送られず、ログイン画面に戻されます。
「設定」→「一般」の「WordPress アドレス (URL)」と「サイトアドレス (URL)」、またはWP-CLIで現在の値を確認します。
wp option get siteurl
wp option get home
wwwの有無、httpとhttpsが、実際にアクセスしているURLと一致しているか- Webサーバーのリダイレクト(wwwあり・なしの統一、HTTPSへの転送)が、WordPressの設定と同じ向きになっているか
wp-config.phpに、移行前の環境のCOOKIE_DOMAINやCOOKIEPATHなどの定義が残っていないか
通常のサイトでは、COOKIE_DOMAIN などのCookie関係の定数を設定する必要はありません。WordPressがURLの設定から自動で決めます。心当たりのない定義があれば、バックアップを取ってから削除して試してください。
4. セキュリティキーの変更を確認する
wp-config.php の AUTH_KEY、SECURE_AUTH_KEY、LOGGED_IN_KEY、NONCE_KEY と各 _SALT は、ログインのCookieの署名に使われます。値が変わると、それまでのCookieはすべて無効になり、全員がログアウトされます。
- 自動で変更する機能:セキュリティ系のプラグインには、セキュリティキーを定期的に自動で変更する機能があります(例:Sucuri Securityの「Activate Automatic Secret Keys Updater」)。有効にしている場合、変更のたびに全員がログアウトされます
- 複数のサーバーで動かしている場合:ロードバランサーの後ろに複数のWebサーバーを置く構成では、すべてのサーバーの
wp-config.phpで、セキュリティキーを同じ値にします。値が違うと、別のサーバーに振り分けられたときにCookieが無効と判断されます。ログインの情報はデータベースに保存されるため、全サーバーが同じデータベースを使っていれば、PHPのセッションを共有する設定は不要です
5. プラグインの自動ログアウト機能を確認する
一定時間操作がないとログアウトさせる機能や、同時にログインできる数を制限する機能を持つプラグインがあります。セキュリティ系や会員サイト向けのプラグインを使っている場合は、その設定を確認します。
どのプラグインが原因か分からない場合は、WordPress.orgで配布されている「Health Check & Troubleshooting」プラグインのトラブルシューティングモードを使うと、自分のログインだけ一時的にプラグインを無効にした状態で確かめられます。ほかの訪問者の表示には影響しません。
6. キャッシュとCDNの設定を確認する
ページキャッシュのプラグインやCDN(Cloudflareなど)で、すべてのページをキャッシュする設定にしていると、ログイン中の利用者にも未ログイン時のページが返されたり、ログイン画面の応答がキャッシュされたりします。次のものはキャッシュの対象から外します。
/wp-admin/以下と/wp-login.phpwordpress_logged_in_で始まるCookieを持つリクエスト
キャッシュ系のプラグインの多くは、ログイン中の利用者にキャッシュを返さない設定を持っています。CDN側で独自にキャッシュのルールを作っている場合は、そのルールを見直してください。
7. サーバーの時刻を確認する
ログインの有効期限は、サーバーの時刻で判定されます。サーバーの時刻が大きくずれていると、期限の判定がずれます。
timedatectl
System clock synchronized: yes になっていれば、時刻は自動で合わせられています。no の場合は、NTPによる時刻合わせを有効にします(sudo timedatectl set-ntp true)。
ログイン中のセッションを確認する
自分のログインがいくつ残っているかは、「ユーザー」→「プロフィール」の下にある「セッション」で確認でき、「他のすべての場所でログアウト」で自分以外のログインを終了できます。WP-CLIでは次のように確認・削除できます。
# ユーザー admin のセッション一覧(ログイン時刻・有効期限・IPアドレス)
wp user session list admin --fields=login_time,expiration_time,ip
# ユーザー admin のセッションをすべて終了する
wp user session destroy admin --all
まとめ
- WordPressのログインは、Cookieとデータベースのセッションのトークンで保たれ、PHPのセッションは使わない
- 有効期間は「ログイン状態を保存する」なしで2日、ありで14日。
auth_cookie_expirationフィルターで変えられる - 編集中に切れる場合は、Heartbeatが止められていないかを確認する
- ログインを繰り返す場合は、サイトのURL(www・https)と
COOKIE_DOMAINの不一致を確認する - 全員が同時にログアウトされる場合や複数サーバー構成では、セキュリティキーの変更・不一致を確認する
関連記事: