Как создать собственный вид аналитики в WordPress без сторонних сервисов

Владельцы сайтов на WordPress часто сталкиваются с необходимостью отслеживать поведение посетителей, но не всегда хочется использовать сторонние сервисы вроде Google Analytics из-за вопросов конфиденциальности или желания иметь полный контроль над данными. В этой статье мы подробно рассмотрим, как реализовать собственный простой и эффективный вид аналитики прямо в WordPress без привлечения внешних API и сервисов.

Зачем создавать собственную аналитику в WordPress?

Основные причины, которые заставляют разработчиков и владельцев сайтов задуматься о собственной системе аналитики:

  • Контроль данных. Все данные хранятся на собственном сервере, нет зависимости от сторонних сервисов.
  • Минимизация утечек и повышение конфиденциальности пользователей.
  • Гибкость и возможность расширения под свои задачи.
  • Отсутствие блокировок или ограничений, которые иногда вводят сторонние аналитические сервисы.

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

Структура хранения данных аналитики

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

  • ID страницы или поста (post ID), чтобы понимать, какие страницы посещают.
  • Время посещения.
  • IP адрес и User Agent для базового анализа трафика (опционально).
  • Реферер, откуда пришел посетитель.

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

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

    $sql = "CREATE TABLE $table_name (
        id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        post_id BIGINT(20) UNSIGNED NOT NULL,
        visit_time DATETIME NOT NULL,
        user_ip VARCHAR(45) NOT NULL,
        user_agent TEXT NOT NULL,
        referer TEXT NULL,
        PRIMARY KEY  (id),
        KEY post_id (post_id),
        KEY visit_time (visit_time)
    ) $charset_collate;";

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

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

Отслеживание посещений с помощью AJAX

Чтобы не замедлять загрузку страниц и не засорять логи сервера, лучше собирать данные асинхронно — через AJAX запросы после загрузки страницы. В WordPress удобнее использовать AJAX API, что позволяет работать и для авторизованных, и для гостей.

Пример JavaScript, который будет отправлять данные о посещении:

jQuery(document).ready(function($) {
    $.post(wptests_ajax_object.ajax_url, {
        action: 'wptests_track_visit',
        post_id: wptests_ajax_object.post_id,
        nonce: wptests_ajax_object.nonce
    });
});

В PHP необходимо обработать этот запрос и записать данные в таблицу:

function wptests_handle_track_visit() {
    check_ajax_referer('wptests_nonce', 'nonce');

    if ( isset($_POST['post_id']) ) {
        global $wpdb;
        $table = $wpdb->prefix . 'wptests_analytics';
        $post_id = intval($_POST['post_id']);
        $visit_time = current_time('mysql');
        $user_ip = sanitize_text_field($_SERVER['REMOTE_ADDR']);
        $user_agent = sanitize_text_field($_SERVER['HTTP_USER_AGENT']);
        $referer = isset($_SERVER['HTTP_REFERER']) ? sanitize_text_field($_SERVER['HTTP_REFERER']) : '';

        $wpdb->insert(
            $table,
            [
                'post_id' => $post_id,
                'visit_time' => $visit_time,
                'user_ip' => $user_ip,
                'user_agent' => $user_agent,
                'referer' => $referer
            ],
            [ '%d', '%s', '%s', '%s', '%s' ]
        );
    }
    wp_die();
}
add_action('wp_ajax_nopriv_wptests_track_visit', 'wptests_handle_track_visit');
add_action('wp_ajax_wptests_track_visit', 'wptests_handle_track_visit');

Чтобы подключить скрипт и передать данные, добавим в functions.php или плагин:

function wptests_enqueue_scripts() {
    if (is_singular()) {
        wp_enqueue_script('wptests-analytics', get_template_directory_uri() . '/js/wptests-analytics.js', ['jquery'], null, true);
        wp_localize_script('wptests-analytics', 'wptests_ajax_object', [
            'ajax_url' => admin_url('admin-ajax.php'),
            'post_id' => get_the_ID(),
            'nonce' => wp_create_nonce('wptests_nonce')
        ]);
    }
}
add_action('wp_enqueue_scripts', 'wptests_enqueue_scripts');

Анализ и вывод статистики в админке WordPress

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

Пример добавления страницы:

function wptests_add_admin_page() {
    add_menu_page(
        'Аналитика посещений',
        'Аналитика WPTests',
        'manage_options',
        'wptests-analytics',
        'wptests_render_analytics_page',
        'dashicons-chart-bar',
        26
    );
}
add_action('admin_menu', 'wptests_add_admin_page');

Функция вывода страницы с простой сводкой по посещениям:

function wptests_render_analytics_page() {
    global $wpdb;
    $table = $wpdb->prefix . 'wptests_analytics';

    $results = $wpdb->get_results("
        SELECT post_id, COUNT(*) as visits
        FROM $table
        GROUP BY post_id
        ORDER BY visits DESC
        LIMIT 20
    ");

    echo '<div class="wrap"><h1>Топ 20 посещаемых страниц</h1><table class="widefat fixed"><thead><tr><th>ID поста</th><th>Название</th><th>Количество посещений</th></tr></thead><tbody>';

    foreach ($results as $row) {
        $title = get_the_title($row->post_id);
        $edit_link = get_edit_post_link($row->post_id);
        echo "<tr><td>{$row->post_id}</td><td><a href='{$edit_link}' target='_blank'>{$title}</a></td><td>{$row->visits}</td></tr>";
    }

    echo '</tbody></table></div>';
}

Такой функционал позволит быстро оценивать популярность контента без использования сторонних инструментов.

Расширение функционала: фильтры и графики

Для более продвинутого анализа можно добавить фильтры по датам, по типу записи и даже визуализацию с помощью JavaScript-библиотек (например, Chart.js). Это позволит получать динамические отчёты прямо в админке.

Пример добавления фильтра по дате — добавьте форму с полями даты и измените SQL-запрос с условием WHERE visit_time >= выбранная дата.

Для графиков установите библиотеку Chart.js и выведите данные в виде диаграмм:

wp_enqueue_script('chart-js', 'https://cdn.jsdelivr.net/npm/chart.js', [], null, true);
// Далее на странице создайте canvas и напишите JS для вывода графика с данными из AJAX или PHP.

Советы по оптимизации и безопасности собственной аналитики

При сборе и хранении данных важно учитывать нагрузку на БД и безопасность:

  • Регулярно очищайте старые записи, чтобы таблица не разрасталась без контроля.
  • Используйте wp_nonce для защиты AJAX-запросов.
  • Ограничивайте частоту запросов с одного IP, чтобы избежать DDoS.
  • Не храните лишних персональных данных, чтобы соответствовать законам о защите данных (например, GDPR).

Для очистки старых данных можно создать WP Cron задачу, которая будет удалять записи старше заданного периода:

function wptests_cleanup_old_analytics() {
    global $wpdb;
    $table = $wpdb->prefix . 'wptests_analytics';
    $date_limit = date('Y-m-d H:i:s', strtotime('-90 days'));
    $wpdb->query($wpdb->prepare("DELETE FROM $table WHERE visit_time < %s", $date_limit));
}
add_action('wptests_daily_cleanup', 'wptests_cleanup_old_analytics');

if (!wp_next_scheduled('wptests_daily_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wptests_daily_cleanup');
}
Автоматическое создание ЧПУ для категорий WordPress
02.12.2025
WooCommerce: автоматическое изменение стоимости товара при смене вариации
01.06.2026
Как добавить дополнительные поля в формы регистрации WordPress
13.12.2025
Как использовать REST API для создания кастомных приложений в WordPress
13.11.2025
Как отключить загрузку шрифтов в WordPress для ускорения сайта
18.01.2026