2026年5月30日

2026年5月30日

WordPressでユーザーの最終ログイン日時を記録・表示する実装方法

WordPress本体はユーザーの最終ログイン日時を保存していないため、記録したい場合はログイン時に呼ばれる wp_login アクションでユーザーメタに日時を保存し、管理画面のユーザー一覧に列を追加して表示します。この記事では、そのまま使えるmu-pluginのコード、並べ替えへの対応、会員向けに「前回のログイン」を表示する方法、そして「ログイン日時」と「最終利用日時」の違いや個人情報としての扱いまで説明します。

実装の全体像

作るものは次の4つです。

  1. ログインのたびに日時をユーザーメタへ保存する処理
  2. 「ユーザー」一覧画面に「最終ログイン」列を追加する処理
  3. その列で並べ替えられるようにする処理
  4. 必要に応じて、本人に前回のログイン日時を見せるショートコード

コードはテーマに依存しない機能なので、wp-content/mu-plugins/ に置くmu-pluginにするのがおすすめです。mu-pluginは管理画面から無効化されず、テーマを変えても動き続けます。子テーマの functions.php でも動作しますが、テーマ変更時に記録が止まる点に注意してください。

作業前にはバックアップを取り、ステージング環境で試してから本番に置きます。mu-pluginで構文エラーが起きると管理画面にも入れなくなることがありますが、その場合はFTPなどでファイルを削除するか名前を変えれば元に戻ります。

ログイン日時を保存する

wp_login アクションは、ユーザー名とパスワードなどでのログインが成功したときに呼ばれ、ユーザー名と WP_User オブジェクトの2つを受け取ります。ここで現在時刻を保存し、それまでの値は「前回のログイン」として別のキーに移しておきます。

<?php
/**
 * Plugin Name: Track last login
 * 保存先: wp-content/mu-plugins/track-last-login.php
 */
defined( 'ABSPATH' ) || exit;

// ログイン成功時に日時を記録する
add_action( 'wp_login', function ( $user_login, $user ) {
	$previous = (int) get_user_meta( $user->ID, 'mysite_last_login', true );
	if ( $previous ) {
		update_user_meta( $user->ID, 'mysite_prev_login', $previous );
	}
	update_user_meta( $user->ID, 'mysite_last_login', time() );
}, 10, 2 );

保存する値は time() が返すUNIXタイムスタンプ(タイムゾーンに依存しない秒数)にしています。日付の文字列で保存すると、後でサイトのタイムゾーン設定を変えたときに表示がずれたり、並べ替えが文字列比較になったりします。表示するときにサイトのタイムゾーンへ変換するのが扱いやすい方法です。

メタキーに mysite_ のような接頭辞を付けているのは、プラグインなどが使うキーとの衝突を避けるためです。

ユーザー一覧に「最終ログイン」列を追加する

続けて、同じファイルに一覧画面の列を追加するコードを書きます。

// 列を追加する
add_filter( 'manage_users_columns', function ( $columns ) {
	$columns['mysite_last_login'] = '最終ログイン';
	return $columns;
} );

// 列の中身を出力する
add_filter( 'manage_users_custom_column', function ( $output, $column_name, $user_id ) {
	if ( 'mysite_last_login' !== $column_name ) {
		return $output;
	}
	$timestamp = (int) get_user_meta( $user_id, 'mysite_last_login', true );
	if ( ! $timestamp ) {
		return esc_html( '記録なし' );
	}
	$format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' );
	return esc_html( wp_date( $format, $timestamp ) );
}, 10, 3 );

// 列を並べ替え可能にする
add_filter( 'manage_users_sortable_columns', function ( $columns ) {
	$columns['mysite_last_login'] = 'mysite_last_login';
	return $columns;
} );

// 並べ替えの指定をメタ値の数値順に変換する
add_action( 'pre_get_users', function ( $query ) {
	if ( ! is_admin() || 'mysite_last_login' !== $query->get( 'orderby' ) ) {
		return;
	}
	$query->set( 'meta_key', 'mysite_last_login' );
	$query->set( 'orderby', 'meta_value_num' );
} );

manage_users_custom_column はフィルターなので、echo ではなく値を返します。ここを echo にすると、列がずれて表示される原因になります。日時の表示には wp_date() を使っており、「設定」→「一般」のタイムゾーンと日付・時刻の形式がそのまま反映されます。

並べ替えでは meta_key を指定するため、まだ一度もログイン記録がないユーザー(コードを入れる前からログインしていないユーザー)は、並べ替え時に一覧から外れます。「記録なし」のユーザーも含めて並べたい場合は、meta_query で「キーが存在しない」条件をOR指定する方法がありますが、まずはこの仕様を理解したうえで使うのが簡単です。

設置後、一度ログアウトしてログインし直し、一覧の列に日時が出るかを確認します。WP-CLIが使える環境では、wp user meta get 1 mysite_last_login でユーザーID 1 の保存値を直接確認できます。

本人に「前回のログイン」を表示する

会員サイトでは、マイページに前回のログイン日時を出すと、身に覚えのないログインに本人が気付くきっかけになります。ログイン直後は mysite_last_login が今回の日時に更新されているため、表示には mysite_prev_login を使います。

// [mysite_previous_login] で、ログイン中の本人に前回のログイン日時を表示する
add_shortcode( 'mysite_previous_login', function () {
	if ( ! is_user_logged_in() ) {
		return '';
	}
	$timestamp = (int) get_user_meta( get_current_user_id(), 'mysite_prev_login', true );
	if ( ! $timestamp ) {
		return '';
	}
	$format = get_option( 'date_format' ) . ' ' . get_option( 'time_format' );
	return '<p class="mysite-prev-login">' . esc_html( '前回のログイン:' . wp_date( $format, $timestamp ) ) . '</p>';
} );

ショートコードは常にログイン中の本人の情報だけを返し、URLのパラメーターなどで他人のユーザーIDを指定できる作りにはしていません。他人の記録を表示する画面を作る場合は、current_user_can( 'list_users' ) などで権限を確かめてから出力してください。

「最終ログイン」と「最終利用」は別物

wp_login で記録できるのは「ログイン操作をした日時」です。次のような場合は呼ばれないため、実際の利用状況より古い日時が表示されることがあります。

  • ログイン状態の保持:「ログイン状態を保存する」にチェックを入れると、認証クッキーは初期設定で14日間有効になります。その間はログイン操作が発生しないため、日時は更新されません。
  • アプリケーションパスワードやREST API:外部ツールからの認証では、通常のログイン処理を通りません。
  • 一部のSSO・ソーシャルログイン・二段階認証プラグイン:ログイン処理の組み立て方によって、wp_login が呼ばれるタイミングが異なる、または呼ばれない場合があります。導入済みのプラグインで記録されるかを実際に確かめてください。

「最後にサイトを使った日時」を知りたい場合は、ログイン中のアクセスで日時を更新する処理を追加します。毎回書き込むとデータベースの負荷になるため、一定時間ごとに間引きます。

// ログイン中のアクセスで「最終利用日時」を15分おきに更新する
add_action( 'init', function () {
	if ( ! is_user_logged_in() ) {
		return;
	}
	$user_id = get_current_user_id();
	$last    = (int) get_user_meta( $user_id, 'mysite_last_seen', true );
	if ( time() - $last < 15 * MINUTE_IN_SECONDS ) {
		return;
	}
	update_user_meta( $user_id, 'mysite_last_seen', time() );
} );

get_user_meta() の結果はオブジェクトキャッシュに載るため、間引きの判定自体は軽い処理です。一覧に表示したい場合は、前の節と同じ要領で列を追加します。

プラグインで済ませる選択肢

コードを書かずに済ませたい場合は、ログインを含む操作履歴を記録するプラグインも選択肢です。WP Activity Log や Simple History は、ログインの成功・失敗を含むさまざまな操作をログに残せます。最終ログイン日時の列だけを追加する小さなプラグインもありますが、更新が止まっているものもあるため、公式ディレクトリで最終更新日と対応バージョンを確認してから選んでください(2026年10月現在)。

「誰がいつログインしたか」に加えて「何を変更したか」まで追いたい場合は、操作履歴プラグインのほうが向いています。逆に、一覧に日時を出すだけなら、この記事のコードのほうが軽量で、保存されるデータも把握しやすくなります。

個人情報としての扱い

ログイン日時は、特定のユーザーの行動を示す個人情報にあたります。次の点を押さえておきます。

  • 目的を決め、最小限にする:休眠アカウントの整理や不正ログインの発見など、目的に必要な範囲で記録します。IPアドレスやブラウザ情報まで保存する場合は、さらに慎重な扱いが必要です。
  • プライバシーポリシーに記載する:ログイン日時を記録していること、その目的と保存期間を明記します。
  • 閲覧できる人を限定する:ユーザー一覧を見られるのは通常、管理者などに限られます。編集者などに一覧を開放するカスタム権限を作っている場合は、表示範囲を見直します。
  • 削除への対応:ユーザーメタはユーザーを削除すると一緒に消えます。退会時の削除や個人データのエクスポートの扱いも、運用ルールとして決めておきます。

まとめ

  • 最終ログイン日時は本体に保存されないため、wp_login アクションでUNIXタイムスタンプをユーザーメタに保存する。
  • 一覧への表示は manage_users_columns と manage_users_custom_column、並べ替えは manage_users_sortable_columns と pre_get_users で行い、出力はエスケープする。
  • 表示は wp_date() でサイトのタイムゾーンに合わせ、本人向けには前回のログイン日時を出す。
  • ログイン状態の保持やAPI認証では記録されないため、実際の利用状況を知りたい場合は間引きながら最終利用日時も保存する。
  • ログイン日時は個人情報として扱い、目的・閲覧範囲・プライバシーポリシーへの記載を整える。

お気軽にご相談ください

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