WordPress логирование: полное руководство по аудиту и отслеживанию действий пользователей

Почему логирование критично для любого WordPress‑сайта

Без аудита вы не увидите, кто и какие изменения вносил в контент, плагины или настройки. Это приводит к потере данных, взломам и проблемам с безопасностью. Хорошо настроенное логирование позволяет быстро реагировать на инциденты, проводить форензик‑анализ и соответствовать требованиям GDPR.

Плагины аудита: готовые решения «из коробки»

Для большинства проектов достаточно установить один из проверенных плагинов. Ниже – три лидера 2026‑го года.

  • WP Activity Log – более 200 000 активных установок, детальный журнал действий администраторов, редакторов и пользователей.
  • Activity Log от WPBox – лёгкий, поддерживает экспорт в CSV и интеграцию с Slack.
  • Simple History – простой интерфейс, запись в файл debug.log и возможность отправки по email.

Все плагины сохраняют логи в базу wp_usermeta или отдельную таблицу, что упрощает последующий поиск.

Ручное логирование в базе данных

Если нужен кастомный набор полей или минимальная нагрузка, можно написать собственный обработчик.

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

function wpb_create_log_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'custom_log';
    $charset_collate = $wpdb->get_charset_collate();
    $sql = "CREATE TABLE $table_name (
        id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        user_id BIGINT(20) UNSIGNED NOT NULL,
        action VARCHAR(255) NOT NULL,
        description TEXT NULL,
        ip VARCHAR(45) NOT NULL,
        created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY  (id)
    ) $charset_collate;";
    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta( $sql );
}
register_activation_hook( __FILE__, 'wpb_create_log_table' );

Функция записи лога

function wpb_log_action( $action, $description = '' ) {
    if ( ! is_user_logged_in() ) return;
    global $wpdb;
    $table = $wpdb->prefix . 'custom_log';
    $wpdb->insert( $table, array(
        'user_id'    => get_current_user_id(),
        'action'     => sanitize_text_field( $action ),
        'description'=> wp_kses_post( $description ),
        'ip'         => $_SERVER['REMOTE_ADDR'],
    ), array('%d','%s','%s','%s') );
}
// Пример: логируем публикацию поста
add_action( 'publish_post', function( $post_ID ) {
    wpb_log_action( 'publish_post', "Post ID $post_ID published" );
});

Такой подход даёт полную свободу: вы решаете, какие события фиксировать и в каком виде.

Отправка логов на внешний сервер

Для масштабных проектов часто используют централизованные системы (ELK, Graylog, Splunk). Ниже – простой способ отправки по HTTP POST.

Настройка webhook‑а

function wpb_send_log_to_remote( $log_entry ) {
    $endpoint = 'https://logserver.example.com/api/wordpress';
    $args = array(
        'body'    => json_encode( $log_entry ),
        'headers' => array(
            'Content-Type' => 'application/json',
            'Authorization'=> 'Bearer YOUR_TOKEN',
        ),
        'timeout' => 5,
    );
    wp_remote_post( $endpoint, $args );
}

function wpb_log_and_send( $action, $desc = '' ) {
    $log = array(
        'user_id'    => get_current_user_id(),
        'action'     => $action,
        'description'=> $desc,
        'ip'         => $_SERVER['REMOTE_ADDR'],
        'time'       => current_time('mysql'),
    );
    wpb_log_action( $action, $desc ); // запись в БД
    wpb_send_log_to_remote( $log );   // отправка наружу
}
add_action( 'wp_login', function(){ wpb_log_and_send('login_success','User logged in'); });

Не забудьте включить WP_DEBUG и проверять ответы сервера, иначе вы потеряете часть данных.

Лучшие практики и рекомендации

  1. Храните логи не менее 90 дней. Это минимум для расследования инцидентов.
  2. Ограничьте доступ к таблице логов. Добавьте правило CAPABILITY только для администраторов.
  3. Управляйте размером файлов. При использовании debug.log включите log_rotation через cron.
  4. Шифруйте передачу. Если отправляете логи наружу, используйте HTTPS (см. Полный гайд: HTTPS в WordPress).
  5. Интегрируйте с CDN. При работе с Cloudflare или Bunny CDN можно добавить правила firewall, блокирующие подозрительные IP (подробно в статье CDN WordPress настройка).
  6. Тестируйте на staging. Прежде чем включать детальное логирование в продакшн, проверьте нагрузку на базу.
  7. Автоматизируйте оповещения. Настройте webhook в Slack или Telegram, используя плагин Activity Log.

Следуя этим рекомендациям, вы сведёте к минимуму риски и получите мощный инструмент для поддержки и развития сайта.

Заключение

Логирование WordPress – это не просто «красивый» функционал, а обязательный элемент любой профессиональной инфраструктуры. Выберите подходящий плагин, либо реализуйте кастомный механизм, и не забудьте о централизованной отправке и безопасном хранении. При правильной настройке вы сможете быстро находить причины ошибок, фиксировать несанкционированные действия и поддерживать высокий уровень безопасности.

Если вы планируете масштабировать проект, обратите внимание на выбор VPS (см. Как правильно выбрать VPS для WordPress) и контейнеризацию с Docker (Docker + WordPress гайд).

❓ Часто задаваемые вопросы

Какой плагин лучше подходит для небольших сайтов?

Для небольших проектов достаточно Simple History – он лёгок, записывает в файл debug.log и поддерживает отправку по email.

Можно ли хранить логи в отдельной таблице без плагина?

Да, создайте свою таблицу через dbDelta и используйте функции wp_insert() для записи; пример кода приведён в статье.

Как отправлять логи в сторонний сервис безопасно?

Отправляйте их через HTTPS, используя wp_remote_post с токеном авторизации и JSON‑тела, как показано в примере.

Нужен ли отдельный сервер для логов?

Для больших сайтов рекомендуется централизованный лог‑сервер (ELK, Graylog). Для небольших достаточно внешнего webhook‑а.