Отчеты по посетителям — важный инструмент для анализа поведения пользователей и улучшения сайта. В этой статье мы подробно разберем, как создать автоматический отчет по посетителям WordPress, который будет собирать данные и отправлять их администратору без вашего участия. Мы рассмотрим и готовые решения, и пример ручной реализации с кодом.
Почему стоит создавать автоматические отчеты по посетителям WordPress
Стандартные плагины аналитики отлично подходят для сбора данных, но часто предоставляют слишком много информации или требуют входа в сторонние сервисы. Автоматические отчеты, которые вы создаете сами, позволяют:
- Получать нужную статистику в удобном формате.
- Настроить сбор именно тех данных, которые важны для вашего проекта.
- Экономить время, автоматизируя рутину.
- Избежать зависимости от сторонних сервисов.
Для этого удобно использовать WP-Cron, который позволяет запускать задачи по расписанию прямо на сервере WordPress.
Основные задачи для автоматического отчета по посетителям
Перед тем как начать разработку, определим, какие данные мы будем собирать:
- Количество уникальных посетителей за период.
- Популярные страницы (по просмотрам).
- Источники трафика (рефереры).
- Время, проведенное на сайте.
- Ошибки 404, если есть.
В зависимости от потребностей вы можете расширять или сужать список.
Использование готовых плагинов для автоматических отчетов по посетителям
Если вы хотите быстро получить базовую аналитику, обратите внимание на такие плагины:
- Clearfy Pro — многофункциональный плагин с возможностью сбора и автоматической отправки отчетов по посещаемости.
- WPRemark — инструмент для создания отчетов с кастомными метриками и отправкой на почту.
Но если вам нужна более глубокая кастомизация, стоит рассмотреть создание своего решения.
Создаем базовый плагин для сбора статистики посетителей и отчетов
Ниже пример, как собрать базовые данные о посетителях и отправлять еженедельный отчет администратору.
1. Создаем таблицу для хранения статистики
В файле плагина используем активацию для создания таблицы в базе данных:
register_activation_hook(__FILE__, 'wpskill_create_visitors_table');
function wpskill_create_visitors_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpskill_visitors';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
visit_date DATE NOT NULL,
ip_address VARCHAR(45) NOT NULL,
page_url TEXT NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}2. Записываем посещения
Добавляем функцию, которая будет сохранять данные о посещении при загрузке страницы:
add_action('wp', 'wpskill_record_visitor');
function wpskill_record_visitor() {
if (is_admin()) return; // не записываем админские посещения
global $wpdb;
$table_name = $wpdb->prefix . 'wpskill_visitors';
$ip = $_SERVER['REMOTE_ADDR'];
$page = esc_url_raw($_SERVER['REQUEST_URI']);
$date = current_time('Y-m-d');
// Проверяем, не записан ли уже этот IP сегодня на эту страницу
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM $table_name WHERE ip_address = %s AND visit_date = %s AND page_url = %s",
$ip, $date, $page
));
if (!$exists) {
$wpdb->insert($table_name, [
'visit_date' => $date,
'ip_address' => $ip,
'page_url' => $page
]);
}
}3. Создаем WP-Cron задание для еженедельной отправки отчета
Добавляем расписание и функцию отправки:
add_action('wpskill_weekly_report_event', 'wpskill_send_weekly_report');
function wpskill_send_weekly_report() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpskill_visitors';
$week_ago = date('Y-m-d', strtotime('-7 days'));
$total_visits = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(DISTINCT ip_address) FROM $table_name WHERE visit_date >= %s",
$week_ago
));
$popular_pages = $wpdb->get_results($wpdb->prepare(
"SELECT page_url, COUNT(*) as cnt FROM $table_name WHERE visit_date >= %s GROUP BY page_url ORDER BY cnt DESC LIMIT 5",
$week_ago
), ARRAY_A);
$message = "Отчет за последнюю неделю:\n";
$message .= "Уникальных посетителей: $total_visits\n";
$message .= "Популярные страницы:\n";
foreach ($popular_pages as $page) {
$message .= $page['page_url'] . ' - ' . $page['cnt'] . " посещений\n";
}
wp_mail(get_option('admin_email'), 'Еженедельный отчет по посетителям', $message);
}
// Регистрируем событие при активации плагина
register_activation_hook(__FILE__, 'wpskill_schedule_weekly_report');
function wpskill_schedule_weekly_report() {
if (!wp_next_scheduled('wpskill_weekly_report_event')) {
wp_schedule_event(time(), 'weekly', 'wpskill_weekly_report_event');
}
}
// Удаляем расписание при деактивации
register_deactivation_hook(__FILE__, 'wpskill_clear_scheduled_report');
function wpskill_clear_scheduled_report() {
$timestamp = wp_next_scheduled('wpskill_weekly_report_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpskill_weekly_report_event');
}
}Расширяем возможности и интеграция с плагинами
Добавление источников трафика
Чтобы добавить информацию об источниках трафика, можно расширить таблицу и сохранять HTTP_REFERER:
$sql = "CREATE TABLE $table_name (
id BIGINT(20) NOT NULL AUTO_INCREMENT,
visit_date DATE NOT NULL,
ip_address VARCHAR(45) NOT NULL,
page_url TEXT NOT NULL,
referer TEXT NULL,
PRIMARY KEY (id)
) $charset_collate;";И в функции записи добавить:
$referer = isset($_SERVER['HTTP_REFERER']) ? esc_url_raw($_SERVER['HTTP_REFERER']) : '';
// Вставка с referer
$wpdb->insert($table_name, [
'visit_date' => $date,
'ip_address' => $ip,
'page_url' => $page,
'referer' => $referer
]);Использование плагина WPRemark для отчетов
Если хотите более продвинутые отчеты с графиками и удобным интерфейсом, рекомендуем посмотреть WPRemark. Он позволяет создавать кастомные метрики, планировать отправку по расписанию и интегрируется с вашей статистикой.
Оптимизация и безопасность
При работе с IP и статистикой важно учитывать:
- Обрабатывать данные с учётом GDPR, если сайт работает с пользователями из ЕС.
- Очищать таблицу от старых данных, чтобы она не разрасталась бесконтрольно.
- Использовать транзиенты для кэширования тяжелых запросов.
- Проверять, чтобы wp_mail отправлял письма корректно – можно использовать SMTP-плагины.
Пример очистки старых данных раз в месяц через WP-Cron:
add_action('wpskill_monthly_cleanup_event', 'wpskill_cleanup_old_visitors');
function wpskill_cleanup_old_visitors() {
global $wpdb;
$table_name = $wpdb->prefix . 'wpskill_visitors';
$cutoff_date = date('Y-m-d', strtotime('-90 days'));
$wpdb->query($wpdb->prepare("DELETE FROM $table_name WHERE visit_date < %s", $cutoff_date));
}
register_activation_hook(__FILE__, 'wpskill_schedule_monthly_cleanup');
function wpskill_schedule_monthly_cleanup() {
if (!wp_next_scheduled('wpskill_monthly_cleanup_event')) {
wp_schedule_event(time(), 'monthly', 'wpskill_monthly_cleanup_event');
}
}
register_deactivation_hook(__FILE__, 'wpskill_clear_scheduled_cleanup');
function wpskill_clear_scheduled_cleanup() {
$timestamp = wp_next_scheduled('wpskill_monthly_cleanup_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpskill_monthly_cleanup_event');
}
}