WordPressを10分で自動ログアウトさせる。共有PCのアイドル判定を実装する

共有PCで操作がない時間を測り、10分後にWordPressからログアウトする仕組み

共有PCでWordPressへログインしたまま席を離れると、次に使う人が前の利用者名で投稿やコメントをする可能性があります。

そこで、通常ログインの利用者に操作がない状態が約10分続いたら、自動でログアウトする仕組みをMUプラグインとして実装しました。「ログイン状態を保存する」を選んだ個人PCは対象外にしています。

この記事では、まず仕組みを理解できる最小例を作り、その後で実運用版に追加した判定を整理します。

共有PCではログアウト忘れが利用者の取り違えにつながる

対象にしたWordPressは、複数の利用者が投稿やコメントを行う社内向けサイトです。共有PCで前の人のセッションが残ると、画面は正常でも、操作した利用者名が違う状態になります。

WordPressのログイン有効期間を一律に短くする方法もありますが、今回は二つの使い方を分ける必要がありました。

  • 共有PC:ログイン状態を保存せず、無操作が続いたら短時間でログアウト
  • 個人PC:「ログイン状態を保存する」を選んだ場合は、自動ログアウトの対象外

単なる10分タイマーではなく、どのログインを対象にするかまで仕組みに含めました。

どこへコードを置くか

実装場所には、WordPressのMUプラグインを使いました。MUは「Must Use」の略で、通常のプラグイン画面から有効化しなくても、所定のフォルダーに置くと自動で読み込まれます。

wp-content/
└── mu-plugins/
    └── maniaru-idle-logout.php

次の最小例は、ファイルを編集できるローカルまたは検証用WordPressで試します。先にサイトとデータベースをバックアップし、本番環境へ直接追加しません。

  • WordPressのファイルへアクセスできる
  • wp-content/mu-plugins フォルダーがある
  • ログアウトしても戻れる検証用アカウントがある

フォルダーがなければ検証環境内で作成します。PHPファイルの保存後は、管理画面の「プラグイン」から「必須」または「Must-Use」の一覧に表示されることを確認します。

最小コードで無操作時間を判定する

次は学習用の最小例です。ログイン中の画面へJavaScriptを出力し、キーボード、マウス、タッチ、スクロールがあれば最終操作時刻を更新します。指定時間を過ぎたら、WordPressが生成したログアウトURLへ移動します。

<?php
/**
 * Plugin Name: Idle Logout Learning Sample
 */

if (!defined('ABSPATH')) {
    exit;
}

// 最初は30秒で動作確認し、確認後に10分へ戻します。
const MANIARU_IDLE_TIMEOUT = 30 * SECOND_IN_SECONDS;

function maniaru_idle_logout_output(): void
{
    if (!is_user_logged_in()) {
        return;
    }

    $settings = [
        'timeoutMs' => MANIARU_IDLE_TIMEOUT * 1000,
        'logoutUrl' => wp_logout_url(home_url('/')),
    ];
    ?>
    <script>
    (() => {
        const settings = <?php echo wp_json_encode($settings); ?>;
        let lastActivity = Date.now();

        const recordActivity = () => {
            lastActivity = Date.now();
        };

        ['keydown', 'mousedown', 'touchstart', 'scroll']
            .forEach((eventName) => {
                document.addEventListener(
                    eventName,
                    recordActivity,
                    {passive: true}
                );
            });

        window.setInterval(() => {
            const idleMs = Date.now() - lastActivity;

            if (idleMs >= settings.timeoutMs) {
                window.location.assign(settings.logoutUrl);
            }
        }, 1000);
    })();
    </script>
    <?php
}

add_action('wp_footer', 'maniaru_idle_logout_output', 100);
add_action('admin_footer', 'maniaru_idle_logout_output', 100);

この例は、アイドル判定の中心だけを確認するコードです。実運用版の「ログイン状態を保存する」判定、サーバー側の最終操作時刻、警告画面、複数タブの同期はまだ含みません。

コードを一つずつ確認する

PHPからログアウトURLと時間を渡す

wp_logout_url() を使うと、WordPressがログアウトに必要な情報を含むURLを作ります。JavaScript側でURLを手書きしません。

PHP側の時間は秒、JavaScriptの Date.now() はミリ秒なので、* 1000 で単位をそろえています。

利用者の操作で時刻を更新する

recordActivity() は、最後に操作した時刻を現在時刻へ更新します。キーボード、マウス、タッチ、スクロールを「利用中」として扱います。

1秒ごとに経過時間を比べる

setInterval() で1秒ごとに、現在時刻と最終操作時刻の差を計算します。設定時間以上になった場合だけ、ログアウトURLへ移動します。

公開画面と管理画面の両方へ出力する

wp_footer はサイトの公開画面、admin_footer はWordPress管理画面で実行します。どちらで操作していても同じタイマーを読み込むためです。

最小例の動作を確認する

最初から10分待つと確認に時間がかかるため、検証環境では一時的に30秒へ短縮します。

  1. 検証用アカウントでWordPressへログインする
  2. 公開画面を開き、30秒間操作しない
  3. ログアウトされ、ログアウト後のURLへ移動することを確認する
  4. もう一度ログインし、30秒以内にスクロールする
  5. 操作した時点からタイマーが延びることを確認する
  6. 管理画面でも同じ二つの確認を行う

確認後は定数を次のように戻します。

const MANIARU_IDLE_TIMEOUT = 10 * MINUTE_IN_SECONDS;

成功状態は、「時間が来たらログアウトする」だけではありません。操作を続けている間はログアウトされず、公開画面と管理画面の両方で同じ挙動になることまで確認します。

実運用版で追加した仕組み

最小例は同じ画面内のJavaScriptだけで時刻を持っています。実際の共有PC運用では、それだけでは足りないため、次の処理を追加しました。

  • 「ログイン状態を保存する」を選んだブラウザをCookieで判定し、対象外にする
  • WordPressのセッションごとに、サーバー側にも最終操作時刻を保存する
  • 利用者が操作したときだけ、nonce付きAJAXで最終操作時刻を更新する
  • 自動通信だけでログイン時間が延びないよう、通常の画面操作とAJAX・cronを分ける
  • ログアウト1分前に警告し、「利用を続ける」と「今すぐログアウト」を選べるようにする
  • 同じ利用者が複数タブを開いた場合、最終操作時刻をブラウザ内でそろえる

また、JavaScriptが止まった場合でも、次のページ表示時にサーバー側で経過時間を確認し、古いセッションを終了できるようにしました。

「ログイン状態を保存する」を別に扱う理由

WordPressのログインCookieがあるだけでは、共有PCの短時間ログインか、個人PCで保存を選んだログインかを、後の画面で単純に区別しにくい場面があります。

実運用版では、ログインCookieが設定されるタイミングで保存選択を示す専用の印を同じブラウザへ残し、自動ログアウトの対象判定だけに使いました。通常のWordPress認証Cookie自体は書き換えていません。

導入前からログイン中の利用者については、既存Cookieの残り有効期間を確認し、長期ログインと判断できる場合は対象外へ引き継ぐ処理も入れました。

実際に確認した結果

実装後は、通常ログインとログイン保持を選んだ状態を分けて確認しました。

  • 通常ログインは、操作がない状態が約10分続くとログアウトする
  • キーボード、マウス、タッチ、スクロール操作でタイマーが延長される
  • ログアウト前に警告が表示され、利用を続けられる
  • 「ログイン状態を保存する」を選んだ利用者は対象外になる
  • 公開画面と管理画面の両方で動作する

これにより、共有PCでは短時間でセッションを閉じ、個人PCではログイン保持を使える運用に分けられました。

タイマーだけでなく、対象と確認方法を作る

自動ログアウトの中心は、最後の操作時刻と現在時刻を比べる処理です。しかし実際に運用するには、誰を対象にするか、何を操作として数えるか、JavaScriptが動かない場合をどうするかも決める必要がありました。

最小例で中心動作を理解し、実運用ではログイン方式、サーバー側確認、警告、複数タブまで補う。

この順番にすると、長い完成コードをそのまま貼るより、どの処理が何のためにあるかを追いやすくなります。共有PCを含む作業を自動化したPROJECTの流れは、社内ポータルの作業を自動化した記録でまとめています。