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

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

Почему важно отслеживать действия пользователей в WordPress

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

  • Повысить безопасность сайта, выявляя подозрительное поведение.
  • Понять, как пользователи взаимодействуют с ресурсом.
  • Вести аудит изменений контента.
  • Автоматизировать уведомления и отчёты.

Рассмотрим несколько вариантов реализации такой системы.

Использование плагинов для логирования действий

Плагин WP Activity Log

Один из самых популярных решений — WP Activity Log. Он ведёт подробный журнал активности и позволяет фильтровать события.

Преимущества:

  • Отслеживает входы/выходы, изменения постов, пользователей, настроек.
  • Уведомления по email о важных событиях.
  • Интеграция с WooCommerce и другими плагинами.

Чтобы установить плагин, достаточно перейти в админке WordPress в раздел «Плагины» → «Добавить новый», ввести название, установить и активировать.

Плагин Simple History

Если нужен более лёгкий и простой инструмент, стоит обратить внимание на Simple History. Он показывает историю действий прямо в админке.

  • Отслеживает редактирование записей, входы пользователей, изменения страниц.
  • Поддерживает расширение через хуки.

Создание собственного решения для отслеживания действий

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

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

Для начала нужно создать таблицу в базе данных. Можно использовать хук register_activation_hook в плагине:

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

    $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        user_id bigint(20) NOT NULL,
        action varchar(255) NOT NULL,
        object_id bigint(20) DEFAULT NULL,
        object_type varchar(100) DEFAULT NULL,
        action_time datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY  (id)
    ) $charset_collate;";

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

Логирование входа пользователя

Чтобы фиксировать входы, используем хук wp_login:

function wpapp_log_user_login( $user_login, $user ) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wpapp_user_actions';

    $wpdb->insert(
        $table_name,
        array(
            'user_id' => $user->ID,
            'action' => 'login',
            'action_time' => current_time( 'mysql' )
        )
    );
}
add_action( 'wp_login', 'wpapp_log_user_login', 10, 2 );

Логирование редактирования записей

Для отслеживания обновления записей можно использовать хук post_updated:

function wpapp_log_post_update( $post_ID, $post_after, $post_before ) {
    if ( wp_is_post_revision( $post_ID ) ) {
        return;
    }

    global $wpdb;
    $table_name = $wpdb->prefix . 'wpapp_user_actions';
    $current_user = wp_get_current_user();

    $wpdb->insert(
        $table_name,
        array(
            'user_id' => $current_user->ID,
            'action' => 'update_post',
            'object_id' => $post_ID,
            'object_type' => $post_after->post_type,
            'action_time' => current_time( 'mysql' )
        )
    );
}
add_action( 'post_updated', 'wpapp_log_post_update', 10, 3 );

Вывод логов в админке WordPress

Для удобства администратору стоит вывести логи в отдельной странице меню админ-панели. Добавим страницу и таблицу с логами:

function wpapp_register_logs_menu() {
    add_menu_page(
        'Журнал действий пользователей',
        'Логи пользователей',
        'manage_options',
        'wpapp-user-logs',
        'wpapp_display_logs_page',
        'dashicons-list-view',
        80
    );
}
add_action( 'admin_menu', 'wpapp_register_logs_menu' );

function wpapp_display_logs_page() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wpapp_user_actions';

    $logs = $wpdb->get_results( "SELECT * FROM $table_name ORDER BY action_time DESC LIMIT 50" );

    echo '<div class="wrap">';
    echo '<h1>Журнал действий пользователей</h1>';
    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>';
    echo '<tbody>';
    foreach ( $logs as $log ) {
        $user_info = get_userdata( $log->user_id );
        $user_name = $user_info ? $user_info->user_login : 'Неизвестный';
        $object = $log->object_type ? $log->object_type . ' #' . $log->object_id : '-';

        echo "<tr><td>{$log->id}</td><td>{$user_name}</td><td>{$log->action}</td><td>{$object}</td><td>{$log->action_time}</td></tr>";
    }
    echo '</tbody></table>';
    echo '</div>';
}

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

Дополнительные рекомендации и полезные плагины

Для расширения возможностей можно подключить плагины, которые интегрируются с WP Activity Log или Simple History, например, для уведомлений в Telegram или Slack.

Если вы используете плагин Clearfy Pro, он имеет встроенные опции для оптимизации и безопасности, в том числе логи и отчёты.

Важно также регулярно очищать логи, чтобы база данных не разрасталась. Для этого можно добавить WP-Cron задачу, которая будет удалять записи старше определённого времени.

Пример очистки старых логов

function wpapp_cleanup_old_logs() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'wpapp_user_actions';
    $date = date( 'Y-m-d H:i:s', strtotime( '-30 days' ) );

    $wpdb->query( $wpdb->prepare( "DELETE FROM $table_name WHERE action_time < %s", $date ) );
}
add_action( 'wp_scheduled_cleanup', 'wpapp_cleanup_old_logs' );

if ( ! wp_next_scheduled( 'wp_scheduled_cleanup' ) ) {
    wp_schedule_event( time(), 'daily', 'wp_scheduled_cleanup' );
}

Это позволит автоматически удалять логи старше 30 дней.

Наш каталог плагинов WordPress