Зачем нужен журнал изменений в WordPress
Ведение журнала изменений (логирование активности) на сайте WordPress — важный аспект безопасности и контроля. Благодаря журналу можно отслеживать действия пользователей, выявлять подозрительную активность и быстро реагировать на ошибки или попытки взлома. Особенно актуально это для многоавторских блогов, корпоративных сайтов и интернет-магазинов.
Журнал изменений фиксирует такие события, как входы и выходы пользователей, создание и редактирование записей, изменения настроек, удаление контента и другие важные действия. Это позволяет администратору получить подробную картину о происходящем на сайте.
В этой статье мы разберём, как создать собственный журнал изменений в WordPress с помощью кода, а также рассмотрим полезные плагины, которые помогут автоматизировать этот процесс.
Основные события для логирования в WordPress
Для начала стоит определить, какие действия в системе необходимо логировать. Вот список ключевых событий:
- Авторизация пользователя (успешные и неудачные попытки входа);
- Создание, редактирование и удаление записей (постов, страниц, кастомных типов);
- Изменение пользовательских ролей и прав;
- Изменения настроек сайта;
- Установка, активация и деактивация плагинов и тем;
- Комментарии (добавление, редактирование, удаление);
- Загрузка и удаление медиафайлов.
Отслеживание этих событий позволит максимально полно контролировать изменения на сайте.
Пример создания собственного журнала изменений с помощью кода
Для реализации простого журнала изменений мы будем использовать хуки WordPress и сохранять данные в отдельную таблицу базы данных. Это позволит эффективно хранить и фильтровать записи.
Создание таблицы для журнала
Добавим функцию для создания таблицы при активации плагина или темы. В реальном проекте этот код стоит разместить в файле плагина или в functions.php темы:
function journalx_create_log_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'journalx_log';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
event_type VARCHAR(100) NOT NULL,
user_id BIGINT(20) NOT NULL,
event_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
details TEXT NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'journalx_create_log_table');Этот код создаст таблицу wp_journalx_log с полями для типа события, ID пользователя, времени события и подробностями.
Функция для записи событий в журнал
Создадим универсальную функцию, которая будет добавлять записи в нашу таблицу:
function journalx_log_event($event_type, $user_id, $details) {
global $wpdb;
$table_name = $wpdb->prefix . 'journalx_log';
$wpdb->insert(
$table_name,
[
'event_type' => $event_type,
'user_id' => $user_id,
'details' => maybe_serialize($details),
'event_time' => current_time('mysql', 1),
],
[
'%s', '%d', '%s', '%s'
]
);
}Обратите внимание, что детали события сериализуются для хранения сложных данных.
Логирование входа пользователя
Добавим хук для записи события при успешном входе пользователя:
add_action('wp_login', function($user_login, $user) {
journalx_log_event('login', $user->ID, ['username' => $user_login]);
}, 10, 2);Хук wp_login срабатывает при успешной авторизации, что позволяет нам записать событие.
Логирование создания и обновления записей
Для отслеживания изменений контента используем хук save_post:
add_action('save_post', function($post_id, $post, $update) {
// Игнорируем автосохранения и ревизии
if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
return;
}
$user_id = get_current_user_id();
$event_type = $update ? 'post_updated' : 'post_created';
$details = [
'post_id' => $post_id,
'post_title' => $post->post_title,
'post_type' => $post->post_type,
];
journalx_log_event($event_type, $user_id, $details);
}, 10, 3);Теперь при создании или обновлении записи в журнал попадёт соответствующая запись с данными.
Просмотр журнала изменений в админке
Для удобства вы можете создать отдельную страницу в админке для вывода журнала. Ниже пример функции, которая выводит последние 20 записей:
function journalx_show_log_page() {
if (!current_user_can('manage_options')) {
wp_die('Доступ запрещён');
}
global $wpdb;
$table_name = $wpdb->prefix . 'journalx_log';
$results = $wpdb->get_results("SELECT * FROM $table_name ORDER BY event_time DESC LIMIT 20");
echo '<h2>Журнал изменений</h2>';
echo '<table class="wp-list-table widefat fixed striped">';
echo '<thead><tr><th>ID</th><th>Событие</th><th>Пользователь</th><th>Время</th><th>Детали</th></tr></thead><tbody>';
foreach ($results as $row) {
$user_info = get_userdata($row->user_id);
$details = maybe_unserialize($row->details);
echo '<tr>';
echo "<td>{$row->id}</td>";
echo "<td>{$row->event_type}</td>";
echo "<td>" . esc_html($user_info ? $user_info->user_login : 'Гость') . "</td>";
echo "<td>{$row->event_time}</td>";
echo "<td>" . esc_html(print_r($details, true)) . "</td>";
echo '</tr>';
}
echo '</tbody></table>';
}
// Добавьте пункт меню для страницы журнала
add_action('admin_menu', function() {
add_menu_page('Журнал изменений', 'Журнал изменений', 'manage_options', 'journalx-log', 'journalx_show_log_page');
});Так вы получите простой интерфейс для просмотра событий.
Использование готовых плагинов для журнала изменений
Если вы не хотите писать код, можно воспользоваться проверенными плагинами:
- WP Activity Log — один из самых популярных и функциональных плагинов для аудита. Позволяет логировать любое действие, поддерживает фильтры и уведомления.
- Simple History — удобный и лёгкий плагин с простым интерфейсом для просмотра истории изменений.
- Activity Log — бесплатный и интуитивно понятный, подходит для базового аудита.
Для интеграции с продуктами WPShop можно обратить внимание на возможности расширения функционала с помощью их API и хуков.
Как повысить безопасность и производительность журнала
При ведении журнала важно учитывать несколько моментов:
- Ограничение размера журнала. Старые записи стоит архивировать или удалять, чтобы база не разрасталась бесконтрольно.
- Права доступа. Просмотр журнала должен быть доступен только администраторам или доверенным лицам.
- Формат хранения данных. Используйте сериализацию или JSON для хранения сложных данных, чтобы можно было быстро их анализировать.
- Производительность. Не логируйте слишком часто срабатывающие события без необходимости, чтобы не перегружать базу.
Правильная настройка и оптимизация журнала изменений позволит использовать его как мощный инструмент контроля.