2026年5月20日

2026年5月20日

WordPressのユーザー活動ログを記録する方法

はじめに

複数の管理者・編集者がいるサイトでは、誰がいつ何を変更したかを記録する監査ログが重要です。不正アクセスの検知や誤操作の特定に役立ちます。

解決手順

ステップ1:WP Activity Logプラグインを使用する(推奨)

wp plugin install wp-security-audit-log --activate

管理画面 → WP Activity Log → 設定で記録するイベントを選択:

  • ログイン・ログアウト
  • 投稿・固定ページの変更
  • プラグイン・テーマの変更
  • ユーザーアカウントの変更
  • WordPress設定の変更

ステップ2:コードでログイン履歴を記録する

// functions.php — ログイン・ログアウトをカスタムテーブルに記録
add_action('wp_login', function($user_login, $user) {
    global $wpdb;
    $wpdb->insert(
        $wpdb->prefix . 'user_activity_log',
        [
            'user_id'    => $user->ID,
            'user_login' => $user_login,
            'action'     => 'login',
            'ip_address' => $_SERVER['REMOTE_ADDR'] ?? '',
            'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
            'created_at' => current_time('mysql'),
        ],
        ['%d', '%s', '%s', '%s', '%s', '%s']
    );
}, 10, 2);

add_action('wp_logout', function($user_id) {
    global $wpdb;
    $wpdb->insert(
        $wpdb->prefix . 'user_activity_log',
        [
            'user_id'    => $user_id,
            'action'     => 'logout',
            'ip_address' => $_SERVER['REMOTE_ADDR'] ?? '',
            'created_at' => current_time('mysql'),
        ],
        ['%d', '%s', '%s', '%s']
    );
});

ステップ3:ログテーブルを作成する

// functions.php または プラグイン有効化フック
function create_user_activity_log_table() {
    global $wpdb;
    $charset_collate = $wpdb->get_charset_collate();
    $sql = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}user_activity_log (
        id          BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        user_id     BIGINT UNSIGNED NOT NULL,
        user_login  VARCHAR(60),
        action      VARCHAR(50) NOT NULL,
        ip_address  VARCHAR(45),
        user_agent  TEXT,
        created_at  DATETIME NOT NULL,
        PRIMARY KEY (id),
        KEY user_id (user_id),
        KEY created_at (created_at)
    ) $charset_collate;";
    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'create_user_activity_log_table');

ステップ4:投稿の変更もログに記録する

// functions.php — 投稿の保存・更新を記録
add_action('post_updated', function($post_id, $post_after, $post_before) {
    if (wp_is_post_revision($post_id)) {
        return;
    }
    $user = wp_get_current_user();
    // error_log の代わりにカスタムテーブルへ書き込み可能
    error_log(sprintf(
        '[WP Activity] User %s (ID:%d) updated post ID:%d "%s"',
        $user->user_login, $user->ID, $post_id, $post_after->post_title
    ));
}, 10, 3);

ステップ5:WP-CLIでログを確認する

# ログインログを直接DBで確認
wp db query "SELECT user_login, action, ip_address, created_at FROM wp_user_activity_log ORDER BY created_at DESC LIMIT 20;"

注意事項

  • ログテーブルは定期的にクリーニングしてDBの肥大化を防いでください(90日以上のレコードを削除するcronが推奨)
  • IPアドレスはGDPR上の個人データに該当する場合があります。必要に応じてプライバシーポリシーに記載してください
  • ログイン失敗のログには wp_login_failed フックを使用してください

まとめ

ユーザー活動ログには WP Activity Log プラグインが最も手軽です。コードで実装する場合は wp_loginwp_logoutpost_updated フックを使い、カスタムテーブルに記録します。

お気軽にご相談ください

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