【WordPress】ログイン時間が短すぎるのをなんとかしたい

WordPressの管理画面は毎日のようにアクセスする画面なのですが、頻繁にログインを求められてちょっと面倒くさい。セキュリティ的な意味で長くしすぎない、定期的にログインを求めるという仕組みが正しいのはわかるのですけど、アクセスしたときに延長するとかなんとかして欲しい。というかそもそもこれって何日ごとにログインする必要があるんでしょう?






ソースコードを眺めてみた

同じようなことを考える人はいるみたいで、古いバージョンの情報はこちらにあります(2014年の記事です)。


よって、cookie発行時の有効期間を変更すれば良いのですが、 作業を行った2013年当時、WordPressのバージョンは3.5で、 WordPressのAPIやフィルターフック等の仕様を見ても方法が見つからず、 ソースを一つ一つ追っていくしかありませんでした。 ログイン処理を追っていったところ、こんな記述を発見。

WordPressで会員サイトの自動ログイン期間(cookie有効期間)を変更する |


記事からすでに8年が経過ていますし現在のソースコードを見てみましょう。最新のソースは以下にあり、バージョンは「6.0-beta1-53184」です。


https://github.com/WordPress/WordPress


wp-includes/pluggable.php

function wp_set_auth_cookie( $user_id, $remember = false, $secure = '', $token = '' ) {
   if ( $remember ) {
       /**
        * Filters the duration of the authentication cookie expiration period.
        *
        * @since 2.8.0
        *
        * @param int  $length   Duration of the expiration period in seconds.
        * @param int  $user_id  User ID.
        * @param bool $remember Whether to remember the user login. Default false.
        */
       $expiration = time() + apply_filters( 'auth_cookie_expiration', 14 * DAY_IN_SECONDS, $user_id, $remember );

       /*
        * Ensure the browser will continue to send the cookie after the expiration time is reached.
        * Needed for the login grace period in wp_validate_auth_cookie().
        */
       $expire = $expiration + ( 12 * HOUR_IN_SECONDS );
   } else {
       /** This filter is documented in wp-includes/pluggable.php */
       $expiration = time() + apply_filters( 'auth_cookie_expiration', 2 * DAY_IN_SECONDS, $user_id, $remember );
       $expire     = 0;
   }

   //以下略
}
https://github.com/WordPress/WordPress/blob/e86b90cad6330eea636496f7317fac4c1a73e42b/wp-includes/pluggable.php#L908-L930


さすがにバージョン重ねてソースも読みやすくなってますね。


$expiration

定数 DAY_IN_SECONDS が恐らく1日分の秒数。ログイン時に表示されている「ログイン状態を保存する」にチェックを入れている場合は14日間、入れていない場合は2日間でログイン状態が解除されるということのようです。






$expire

さらに $expire とはなんぞや?コメントを再掲します。


/*
* Ensure the browser will continue to send the cookie after the expiration time is reached.
* Needed for the login grace period in wp_validate_auth_cookie().
*/
https://github.com/WordPress/WordPress/blob/e86b90cad6330eea636496f7317fac4c1a73e42b/wp-includes/pluggable.php#L983-L986


簡単に言うと期限が切たあとでもこの時間内にログインしてトークンの確認が出来ればログインの有効期限が延ばせるっていうことかな。「ログイン状態を保存する」にチェックを入れている場合は有効期限切れから12時間以内、チェックを入れていない場合は有効期限は延ばせません。



変更するには:auth_cookie_expirationフィルターを上書きしましょう

結論としては $expiration を変更すればログイン可能時間を変更出来そうです。$expiration は現在時刻にauth_cookie_expirationで指定した時間を加えることで実現しています。レファレンスを読むとこういう仕様です。


apply_filters( 'auth_cookie_expiration', int $length, int $user_id, bool $remember )
https://developer.wordpress.org/reference/hooks/auth_cookie_expiration/


というわけでこれに則ってカスタムフィルターを作成し、上書きすればOKです。functions.phpにこんな感じの関数を作ればいいかな。


//ログイン時間を延ばす
add_filter('auth_cookie_expiration', function (int $length): int {
   // return YEAR_IN_SECONDS;
   return MONTH_IN_SECONDS;
   // return DAY_IN_SECONDS;
   // return HOUR_IN_SECONDS;
});
ref: https://developer.wordpress.org/reference/hooks/auth_cookie_expiration/#comment-3299


YEAR_IN_SECONDS MONTH_IN_SECONDS DAY_IN_SECONDS HOUR_IN_SECONDS はそれぞれ、1年、1ヶ月(30日間)、1日、1時間の秒数を表す定数です。ここでは有効期限を1ヶ月に延ばしてみました。一度ログアウトしてから試すと、確かに有効期限が延びていました。なるほど。


変更前: 2週間


変更後: 1ヶ月





ご利用は計画的に

今回は有効期限を延ばす変更を行いましたが、一口に有効期限を変更すると言っても環境によって、


  • ログイン有効期限を極力短くして安全性を高めたい
  • ログイン有効期限を長くして利便性を高めたい


という2つの方針に分かれると思います。不特定多数の人間が触る端末や、複数の人間で管理している場合などにおいては有効期限は極力短くした方が良さそうです。一方で個人のブログにおいては、セキュリティとのバランスさえ取れていればある程度有効期限を延ばすのも良いかと。

環境に応じて使い分けてください。