Владельцы сайтов на 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');
}