目次
ソースコードを眺めてみた
同じようなことを考える人はいるみたいで、古いバージョンの情報はこちらにあります(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時間以内、チェックを入れていない場合は有効期限は延ばせません。
結論としては $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-3299YEAR_IN_SECONDS MONTH_IN_SECONDS DAY_IN_SECONDS HOUR_IN_SECONDS はそれぞれ、1年、1ヶ月(30日間)、1日、1時間の秒数を表す定数です。ここでは有効期限を1ヶ月に延ばしてみました。一度ログアウトしてから試すと、確かに有効期限が延びていました。なるほど。
変更前: 2週間
変更後: 1ヶ月
ご利用は計画的に
今回は有効期限を延ばす変更を行いましたが、一口に有効期限を変更すると言っても環境によって、- ログイン有効期限を極力短くして安全性を高めたい
- ログイン有効期限を長くして利便性を高めたい
という2つの方針に分かれると思います。不特定多数の人間が触る端末や、複数の人間で管理している場合などにおいては有効期限は極力短くした方が良さそうです。一方で個人のブログにおいては、セキュリティとのバランスさえ取れていればある程度有効期限を延ばすのも良いかと。
環境に応じて使い分けてください。