Ведение журнала активности пользователей — важный аспект для сайтов на WordPress, которые хотят контролировать действия посетителей, улучшать безопасность и анализировать поведение аудитории. В этой статье разберём, как организовать такой журнал с помощью готовых плагинов и собственных решений с примерами кода.
Зачем нужен журнал активности пользователей в WordPress
Журнал активности помогает фиксировать ключевые события на сайте: входы, выходы, изменения контента, попытки авторизации и прочие действия. Это важно для:
- Увеличения безопасности — отслеживать подозрительные действия и быстро реагировать;
- Аудита — видеть, кто и когда вносил изменения;
- Анализа поведения пользователей — улучшать интерфейс и контент;
- Отладки — выявлять ошибки и проблемы на сайте.
Без такого инструмента сложно понять, что происходит за кулисами вашего сайта, особенно если на нём много администраторов или редакторов.
Использование плагинов для журнала активности в WordPress
Самый простой способ начать — установить готовый плагин. Рассмотрим популярные решения:
WP Activity Log
Один из самых мощных и функциональных плагинов для ведения журнала активности. Позволяет отслеживать более 400 событий, имеет фильтры и уведомления.
Особенности:
- Легкая настройка и интерфейс;
- Поддержка ролей пользователей;
- Отчёты и экспорт данных;
- Интеграция с WooCommerce, BuddyPress и другими.
Установка происходит через стандартный репозиторий WordPress. После активации вы получите журнал с подробной историей действий.
Stream
Stream — бесплатный и простой плагин, который фиксирует изменения в базе данных и действия пользователей.
- Отображает активность в реальном времени;
- Имеет фильтрацию по типам событий;
- Поддерживает расширения для интеграции с другими плагинами.
Подробности и загрузка — на странице плагина в официальном каталоге WordPress.
Создание простого журнала активности с помощью кода
Если нужно решение под себя, можно реализовать базовый журнал активности с помощью пользовательского кода. Ниже пример отслеживания входа пользователя и записи данных в отдельную таблицу базы.
Создание таблицы для хранения лога
function journalx_create_activity_log_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'journalx_user_activity';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
activity varchar(255) NOT NULL,
activity_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
ip_address varchar(100) DEFAULT '' NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
register_activation_hook(__FILE__, 'journalx_create_activity_log_table');
Этот код создаст таблицу wp_journalx_user_activity при активации плагина или темы.
Запись событий входа пользователя
function journalx_log_user_login($user_login, $user) {
global $wpdb;
$table_name = $wpdb->prefix . 'journalx_user_activity';
$ip = journalx_get_user_ip();
$wpdb->insert(
$table_name,
[
'user_id' => $user->ID,
'activity' => 'User logged in',
'ip_address' => $ip
]
);
}
add_action('wp_login', 'journalx_log_user_login', 10, 2);
function journalx_get_user_ip() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
Этот код добавляет запись в таблицу при каждом входе пользователя, фиксируя ID, время и IP адрес.
Отображение журнала активности в админке
Чтобы просматривать журнал, можно создать простую страницу в админке WordPress с таблицей последних событий.
function journalx_register_admin_page() {
add_menu_page(
'Журнал активности',
'Журнал активности',
'manage_options',
'journalx-activity-log',
'journalx_render_admin_page',
'dashicons-list-view',
30
);
}
add_action('admin_menu', 'journalx_register_admin_page');
function journalx_render_admin_page() {
global $wpdb;
$table_name = $wpdb->prefix . 'journalx_user_activity';
$results = $wpdb->get_results("SELECT * FROM $table_name ORDER BY activity_time DESC LIMIT 50");
echo '<div class="wrap"><h1>Журнал активности пользователей</h1><table class="widefat fixed" cellspacing="0">';
echo '<thead><tr><th>ID</th><th>Пользователь</th><th>Активность</th><th>Время</th><th>IP</th></tr></thead><tbody>';
foreach ($results as $row) {
$user_info = get_userdata($row->user_id);
$user_name = $user_info ? esc_html($user_info->user_login) : 'Unknown';
echo '<tr>';
echo '<td>' . esc_html($row->id) . '</td>';
echo '<td>' . $user_name . '</td>';
echo '<td>' . esc_html($row->activity) . '</td>';
echo '<td>' . esc_html($row->activity_time) . '</td>';
echo '<td>' . esc_html($row->ip_address) . '</td>';
echo '</tr>';
}
echo '</tbody></table></div>';
}
Так вы получите простой интерфейс для просмотра последних 50 событий.
Расширение журнала: отслеживание других действий
Вы можете легко добавить логирование других важных событий:
- Создание, редактирование и удаление записей — хуки
save_post,before_delete_post; - Регистрация новых пользователей —
user_register; - Сброс пароля —
after_password_reset; - Изменение профиля —
profile_update.
Пример логирования создания записи:
function journalx_log_post_save($post_id, $post, $update) {
if ($post->post_type !== 'post') return;
global $wpdb;
$table_name = $wpdb->prefix . 'journalx_user_activity';
$user_id = get_current_user_id();
$action = $update ? 'Updated post' : 'Created post';
$wpdb->insert(
$table_name,
[
'user_id' => $user_id,
'activity' => "$action: {$post->post_title}",
'ip_address' => journalx_get_user_ip()
]
);
}
add_action('save_post', 'journalx_log_post_save', 10, 3);
Использование плагина JournalX Expert Review для расширенного аудита
Если на вашем сайте уже установлен плагин JournalX Expert Review, он может помочь в анализе пользовательской активности, собирая отзывы и оценки, что дополняет стандартный журнал событий. Интеграция с вашим журналом активности позволит получать более полную картину взаимодействия пользователей с контентом.
Советы по оптимизации журнала активности
Журнал активности может со временем сильно разрастаться, что влияет на производительность базы данных. Рекомендуется:
- Периодически очищать старые записи (например, старше 6 месяцев);
- Индексировать таблицу по полям user_id и activity_time для ускорения запросов;
- Использовать кэширование при отображении данных в админке;
- Ограничивать количество отображаемых записей на странице.
Пример удаления старых записей:
function journalx_cleanup_old_logs() {
global $wpdb;
$table_name = $wpdb->prefix . 'journalx_user_activity';
$wpdb->query($wpdb->prepare(
"DELETE FROM $table_name WHERE activity_time < %s",
date('Y-m-d H:i:s', strtotime('-6 months'))
));
}
// Запустить по крону или вручную
Выводы и рекомендации
Организация журнала активности пользователей в WordPress — задача решаемая как с помощью готовых плагинов, так и собственных решений с минимальным кодом. Важно продумывать, какие именно действия нужно отслеживать, и оптимизировать хранение данных, чтобы не перегружать сайт. Плагины WP Activity Log и Stream отлично подойдут для большинства задач, а при необходимости можно расширить функционал собственным кодом, как показано в примерах.