Диагностика проблемы неактивных пользователей в WooCommerce
В интернет-магазинах на WooCommerce с течением времени накапливается большое количество пользователей, которые зарегистрировались, но не совершали покупок или вообще не заходили в личный кабинет. Это увеличивает нагрузку на базу данных, может влиять на производительность сайта и усложняет аналитику.
Неактивных пользователей стоит удалять или деактивировать, особенно если магазин большой и пользователей десятки тысяч. Задача — автоматически находить и удалять таких пользователей по критериям активности.
Определяем критерии неактивности
Для удаления пользователей нужно чётко определить, кто считается неактивным. Обычно используют такие критерии:
- Дата последнего входа в систему (например, более 6 месяцев назад);
- Отсутствие совершённых заказов;
- Отсутствие активности на сайте (комментарии, оценки и т.п.).
WooCommerce и WordPress по умолчанию не сохраняют дату последнего входа, поэтому её нужно добавить самостоятельно или использовать плагины.
Как добавить дату последнего входа пользователя
Добавим код, который при каждом входе пользователя обновляет мета-поле last_login с текущей меткой времени:
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('timestamp'));
}, 10, 2);Теперь в базе в таблице wp_usermeta будет храниться время последнего входа.
Пошаговое решение: автоматическое удаление неактивных пользователей
Создадим WP-Cron задачу, которая раз в неделю будет искать и удалять пользователей, которые:
- Не заходили больше 180 дней;
- Не совершали ни одного заказа.
Добавим в functions.php или в отдельный плагин следующий код:
// Запланировать событие при активации плагина
register_activation_hook(__FILE__, function() {
if (!wp_next_scheduled('delete_inactive_users_weekly')) {
wp_schedule_event(time(), 'weekly', 'delete_inactive_users_weekly');
}
});
// Удалить расписание при деактивации
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('delete_inactive_users_weekly');
});
// Хук для удаления пользователей
add_action('delete_inactive_users_weekly', function() {
$threshold = strtotime('-180 days', current_time('timestamp'));
// Получаем ID пользователей, которые не заходили больше 180 дней
$args = [
'meta_key' => 'last_login',
'meta_value' => $threshold,
'meta_compare' => '<=',
'fields' => 'ID',
'role__not_in' => ['administrator', 'shop_manager'], // исключаем админов
'number' => 100,
];
$user_query = new WP_User_Query($args);
$user_ids = $user_query->get_results();
if (empty($user_ids)) return;
foreach ($user_ids as $user_id) {
// Проверяем, есть ли заказы у пользователя
$orders = wc_get_orders([
'customer_id' => $user_id,
'limit' => 1,
'return' => 'ids',
]);
if (empty($orders)) {
wp_delete_user($user_id);
}
}
});Проверка результата после внедрения
Чтобы убедиться, что код работает:
- Проверьте наличие мета-поля
last_loginу пользователей в базеwp_usermeta(например, через phpMyAdmin или плагин для управления пользователями). - Вручную запросите пользователей, у которых
last_loginстарше 180 дней и проверьте, что они не имеют заказов. - Запустите хук вручную в админке через плагин WP Crontrol (https://wordpress.org/plugins/wp-crontrol/) — найдите событие
delete_inactive_users_weeklyи запустите его. - Проверьте, что такие пользователи удалились из базы.
Частые ошибки и как их исправить
- Отсутствие даты последнего входа: если мета-поле
last_loginне обновляется, значит не срабатывает хукwp_login. Проверьте, не конфликтуют ли плагины, и что функция подключена. - Удаляются администраторы или менеджеры: В коде стоит исключение по ролям, но если роли кастомные, добавьте их в параметр
role__not_in. - Не удаляются пользователи с заказами: Функция
wc_get_ordersкорректно работает при условии, что WooCommerce активен и заказов нет. Проверьте, что аргументы передаются правильно. - WP-Cron не запускается автоматически: На некоторых хостингах WP-Cron отключён, настройте системный cron или запускайте вручную.
Практические советы по безопасности и производительности
- Не удаляйте пользователей без резервной копии базы данных.
- Выполняйте удаление небольшими партиями (например, 100 пользователей за раз), чтобы не перегрузить сервер.
- Исключайте из удаления пользователей с ролями администратора и менеджера магазина.
- Используйте WP Crontrol для мониторинга и ручного запуска cron-событий.
- Если вы используете плагин Clearfy Pro от WPShop, он может помочь с очисткой базы и оптимизацией.
Сравнение способов удаления неактивных пользователей
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простой, не требует кода | Трудоёмко, не подходит для большого количества |
| Плагины очистки базы | Автоматизация, удобный интерфейс | Зависимость от стороннего ПО, нагрузка |
| Самописный код с WP-Cron | Гибкость, контроль, без сторонних плагинов | Требует навыков, возможны ошибки в коде |