Как создать плагин для записи логов входа в WordPress

Запись логов входа пользователей — важный элемент безопасности и аудита сайта на WordPress. Это позволяет отслеживать попытки авторизации, выявлять подозрительную активность и быстро реагировать на возможные атаки. В этой статье подробно рассмотрим, как создать собственный плагин для записи логов входа в WordPress, который сохраняет данные в базе и выводит их в админке. Вы увидите примеры кода, объяснения и рекомендации по настройке.

Почему важно вести логи входа в WordPress

Стандартный WordPress не ведет подробных логов успешных и неудачных попыток входа. Это усложняет выявление взломов или подбор паролей. Логи позволяют:

  • Отслеживать IP-адреса и время входа каждого пользователя.
  • Фиксировать неудачные попытки входа и возможные атаки brute force.
  • Вести аудит активности для администраторов и владельцев сайтов.
  • Использовать данные для настройки дополнительных мер безопасности.

Существуют плагины, например, Clearfy Pro, которые расширяют возможности безопасности, но создание собственного решения поможет лучше понять процесс и адаптировать его под свои задачи.

Создаем плагин для записи логов входа: структура и базовый код

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

1. Инициализация плагина и создание таблицы

Для начала создадим файл wpscan-login-logger.php с базовой информацией плагина и функцией установки таблицы в базе данных.

<?php
/*
Plugin Name: WPScan Login Logger
Description: Записывает логи входа пользователей WordPress
Version: 1.0
Author: WPScan.ru
*/

register_activation_hook(__FILE__, 'wpscan_create_login_log_table');

function wpscan_create_login_log_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wpscan_login_logs';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        user_login varchar(60) NOT NULL,
        user_id bigint(20) DEFAULT NULL,
        ip_address varchar(100) NOT NULL,
        login_time datetime NOT NULL,
        success tinyint(1) NOT NULL,
        PRIMARY KEY  (id)
    ) $charset_collate;";

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

В этом коде создается таблица wp_wpscan_login_logs (с префиксом), в которой будут храниться данные: логин пользователя, ID, IP, дата и время, а также статус успешности входа.

2. Запись логов успешных и неудачных попыток входа

Для записи логов нужно использовать хуки, которые вызываются при попытках авторизации. WordPress предоставляет такие хуки:

  • wp_login — успешный вход пользователя.
  • wp_login_failed — неудачная попытка входа.

Добавим функции, которые будут записывать данные в таблицу.

add_action('wp_login', 'wpscan_log_successful_login', 10, 2);
add_action('wp_login_failed', 'wpscan_log_failed_login');

function wpscan_log_successful_login($user_login, $user) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wpscan_login_logs';
    $ip = wpscan_get_user_ip();
    $wpdb->insert(
        $table_name,
        [
            'user_login' => $user_login,
            'user_id' => $user->ID,
            'ip_address' => $ip,
            'login_time' => current_time('mysql'),
            'success' => 1
        ]
    );
}

function wpscan_log_failed_login($user_login) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wpscan_login_logs';
    $ip = wpscan_get_user_ip();
    $wpdb->insert(
        $table_name,
        [
            'user_login' => $user_login,
            'user_id' => null,
            'ip_address' => $ip,
            'login_time' => current_time('mysql'),
            'success' => 0
        ]
    );
}

function wpscan_get_user_ip() {
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        return $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip_list = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        return trim($ip_list[0]);
    } else {
        return $_SERVER['REMOTE_ADDR'] ?? 'UNKNOWN';
    }
}

Функция wpscan_get_user_ip() аккуратно получает IP адрес пользователя, учитывая возможные прокси и заголовки.

Вывод логов в административной панели WordPress

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

Добавление страницы меню и вывод данных

add_action('admin_menu', 'wpscan_add_login_logs_page');

function wpscan_add_login_logs_page() {
    add_menu_page(
        'Логи входа',
        'Логи входа',
        'manage_options',
        'wpscan-login-logs',
        'wpscan_render_login_logs_page',
        'dashicons-list-view',
        81
    );
}

function wpscan_render_login_logs_page() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wpscan_login_logs';
    $logs = $wpdb->get_results("SELECT * FROM $table_name ORDER BY login_time DESC LIMIT 100");

    echo '<div class="wrap"><h1>Логи входа пользователей</h1>';
    echo '<table class="wp-list-table widefat fixed striped">';
    echo '<thead><tr><th>ID</th><th>Пользователь</th><th>IP</th><th>Дата и время</th><th>Результат</th></tr></thead>';
    echo '<tbody>';
    if ($logs) {
        foreach ($logs as $log) {
            $status = $log->success ? '<span style="color:green">Успешно</span>' : '<span style="color:red">Неудача</span>';
            $user_display = $log->user_id ? '<a href="user-edit.php?user_id=' . esc_attr($log->user_id) . '">' . esc_html($log->user_login) . '</a>' : esc_html($log->user_login);
            echo '<tr>';
            echo '<td>' . esc_html($log->id) . '</td>';
            echo '<td>' . $user_display . '</td>';
            echo '<td>' . esc_html($log->ip_address) . '</td>';
            echo '<td>' . esc_html($log->login_time) . '</td>';
            echo '<td>' . $status . '</td>';
            echo '</tr>';
        }
    } else {
        echo '<tr><td colspan="5">Логи отсутствуют</td></tr>';
    }
    echo '</tbody></table></div>';
}

Добавленная страница выводит последние 100 записей с возможностью просмотра, кто и когда пытался войти на сайт.

Дополнительные улучшения и советы по безопасности

Фильтрация и пагинация

Для удобства лучше добавить фильтр по дате, пользователям и IP, а также разбивку на страницы. Это можно реализовать через GET-параметры и SQL-запросы с LIMIT и OFFSET. Такой функционал улучшит анализ логов при большом объеме данных.

Автоматическое удаление старых записей

Для поддержания базы в оптимальном состоянии можно добавить CRON-задачу, которая будет удалять логи старше определенного срока, например, 90 дней:

function wpscan_delete_old_logs() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wpscan_login_logs';
    $days = 90;
    $wpdb->query($wpdb->prepare(
        "DELETE FROM $table_name WHERE login_time < NOW() - INTERVAL %d DAY",
        $days
    ));
}

if (!wp_next_scheduled('wpscan_daily_log_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpscan_daily_log_cleanup');
}
add_action('wpscan_daily_log_cleanup', 'wpscan_delete_old_logs');

Интеграция с плагинами безопасности

Если вы используете Clearfy Pro или другие плагины безопасности, можно интегрировать логи для расширенного мониторинга и блокировки IP на основе анализа попыток входа.

Защита данных логов

Не забывайте, что логи содержат конфиденциальную информацию. Ограничьте доступ к странице с логами только администраторам, используйте SSL на сайте и периодически проверяйте права доступа к базе.

Заключение

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

Если хотите расширить функционал, советую посмотреть плагины с похожими возможностями и адаптировать код под свои нужды. Например, Expert Review поможет добавить пользовательские отзывы, а WPRemark — расширить комментарии и отзывы на сайте.

Как отключить плагины на определённых страницах WordPress
06.02.2026
Как защитить WordPress от удаления аккаунта администратора
09.04.2026
Как защитить WordPress от ботнет атак: эффективные решения
03.02.2026
Защита WordPress от атак через XML-RPC
17.12.2025
Как защитить WordPress от прохождения по слухам и сидтам: практические методы и кодовые решения
15.02.2026