Как добавить логирование и аналитику входа в WordPress без плагинов

Диагностика задачи: зачем нужно логирование входов в WordPress

Система логирования входов в WordPress помогает отслеживать попытки авторизации пользователей, выявлять подозрительную активность и анализировать поведение на сайте. Встроенных функций для детального логирования нет, и многие используют плагины. Но для контроля без сторонних расширений можно реализовать простое логирование через код. Это особенно актуально, если плагинов в проекте много, и вы хотите минимизировать нагрузку.

Пошаговое решение: добавляем собственное логирование событий входа

1. Подключение хука для отслеживания успешной авторизации

WordPress предоставляет хук wp_login, который срабатывает после успешного входа пользователя. Используем его для записи данных в отдельную таблицу базы данных.

function custom_login_log($user_login, $user) {
    global $wpdb;
    $table = $wpdb->prefix . 'login_log';
    $time = current_time('mysql');
    $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
    $wpdb->insert(
        $table,
        [
            'user_login' => $user_login,
            'user_id' => $user->ID,
            'login_time' => $time,
            'ip_address' => $ip
        ]
    );
}
add_action('wp_login', 'custom_login_log', 10, 2);

2. Создание таблицы для хранения логов

Для хранения данных создадим таблицу при активации темы или плагина. Если вы добавляете код в functions.php, запустите этот код один раз вручную или через активацию темы.

function create_login_log_table() {
    global $wpdb;
    $table = $wpdb->prefix . 'login_log';
    $charset_collate = $wpdb->get_charset_collate();
    
    $sql = "CREATE TABLE IF NOT EXISTS $table (
        id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        user_login VARCHAR(60) NOT NULL,
        user_id BIGINT(20) UNSIGNED NOT NULL,
        login_time DATETIME NOT NULL,
        ip_address VARCHAR(100) NOT NULL,
        PRIMARY KEY  (id),
        KEY user_id (user_id),
        KEY login_time (login_time)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}

register_activation_hook(__FILE__, 'create_login_log_table');

3. Добавление страницы в админку для просмотра логов

Чтобы анализировать логи, создадим страницу в админке с таблицей последних входов.

function add_login_log_menu() {
    add_menu_page(
        'Логи входа',
        'Логи входа',
        'manage_options',
        'login-log',
        'render_login_log_page',
        'dashicons-admin-users',
        80
    );
}
add_action('admin_menu', 'add_login_log_menu');

function render_login_log_page() {
    global $wpdb;
    $table = $wpdb->prefix . 'login_log';
    $logs = $wpdb->get_results("SELECT * FROM $table ORDER BY login_time DESC LIMIT 100");
    echo '<h1>Последние 100 входов</h1>';
    echo '<table class="wp-list-table widefat fixed striped">';
    echo '<thead><tr><th>ID</th><th>Логин</th><th>ID пользователя</th><th>Время входа</th><th>IP адрес</th></tr></thead>';
    echo '<tbody>';
    if ($logs) {
        foreach ($logs as $log) {
            echo '<tr>';
            echo '<td>' . esc_html($log->id) . '</td>';
            echo '<td>' . esc_html($log->user_login) . '</td>';
            echo '<td>' . esc_html($log->user_id) . '</td>';
            echo '<td>' . esc_html($log->login_time) . '</td>';
            echo '<td>' . esc_html($log->ip_address) . '</td>';
            echo '</tr>';
        }
    } else {
        echo '<tr><td colspan="5">Логов не найдено</td></tr>';
    }
    echo '</tbody></table>';
}

Проверка результата после внедрения

1. Войдите на сайт под разными пользователями.

2. Зайдите в админ-панель → "Логи входа" (Меню > Логи входа).

3. Убедитесь, что отображаются свежие записи с корректными логинами, ID, временем и IP.

4. Для дополнительной проверки запросите данные напрямую из базы (через phpMyAdmin или командной строкой):

SELECT * FROM wp_login_log ORDER BY login_time DESC LIMIT 5;

Частые ошибки и как их исправить

  • Таблица не создаётся: проверьте, что register_activation_hook вызывается в плагине, а не в теме. Для темы таблицу создайте отдельным скриптом или временно вызовите функцию вручную.
  • Ошибки доступа к базе: убедитесь, что глобальная переменная $wpdb подключена и используется корректно.
  • Неправильный IP адрес: в некоторых случаях $_SERVER['REMOTE_ADDR'] может содержать IP прокси; для реального IP используйте дополнительные проверки, например, HTTP_X_FORWARDED_FOR.
  • Отсутствие доступа к странице логов: проверьте права пользователя, страница доступна только администраторам (capability manage_options).

Практические советы по безопасности и производительности

  • Регулярно очищайте таблицу логов, чтобы избежать роста базы. Добавьте CRON-задачу для удаления старых записей, например старше 1 года.
  • Не храните пароли или другие чувствительные данные в логах.
  • Ограничьте доступ к админке для просмотра логов только доверенным администраторам.
  • Для повышения производительности используйте индексы в таблице по полям user_id и login_time.

Сравнение вариантов реализации логирования

МетодПлюсыМинусыКомпромисс
Готовые плагины (например, WP Activity Log)Готовое решение, удобный интерфейс, дополнительные функции (уведомления)Нагрузка на сайт, возможные конфликты, платные версииИспользовать на больших проектах с нуждой в расширенном аудите
Собственный код с таблицей в базеМинимальная нагрузка, контроль, гибкостьТребует разработки, нет интерфейса по умолчаниюДобавить простую админ-страницу, как в примере
Логирование в файлПростота, не нагружает базуТрудности с анализом, безопасность доступа к файламИспользовать для временного аудита или отладки
Создание и использование автоматического OTP для входа в WordPress без плагинов
19.05.2026
Как использовать WP-Cron для автоматизации задач в WordPress
08.12.2025
Как использовать хук authenticate для дополнительной проверки при входе в WordPress
24.07.2026
Как добавить логины через соцсети в WordPress
26.02.2026
Как защитить WordPress от Brute Force атак с помощью Limit Login Attempts
20.01.2026

wp-login.php - это страница входа в системе управления вордпресс. Если Вы хотите изменить внешний вид страницы входа - читайте здесь. Если вам нужно защитить админку - подробный мануал. Вы можете установить плагин Clearfy, в котором есть функция защиты админки и страницы входа.