Проблема: накопление неактивных пользователей в WooCommerce
Магазины на WooCommerce часто сталкиваются с задачей очистки базы пользователей от неактивных аккаунтов, которые не совершали покупок и не заходили на сайт длительное время. Это снижает нагрузку на базу, улучшает аналитику и безопасность. Встроенных инструментов для автоматического удаления таких пользователей в WooCommerce нет, поэтому приходится реализовывать собственные решения.
Диагностика: как определить неактивных пользователей
Неактивными считаются пользователи, которые:
- Не входили на сайт больше определённого срока (например, 6 месяцев);
- Не совершали заказов;
- Не имеют важных ролей (например, администратора или менеджера).
Проверить дату последнего входа можно с помощью плагинов или записей в метаполях пользователей, если такая информация ведётся. Заказы доступны через таблицу wp_posts с типом shop_order.
Пошаговое решение: реализация автоудаления неактивных пользователей
1. Добавление фиксации даты последнего входа пользователя
По умолчанию WordPress не сохраняет дату последнего логина, добавим её через хук wp_login:
add_action('wp_login', function($user_login) {
$user = get_user_by('login', $user_login);
if ($user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
});2. Функция очистки неактивных пользователей
Создадим функцию, которая удалит пользователей без заказов и с датой последнего входа старше 180 дней, исключая администраторов:
function delete_inactive_woocommerce_users() {
global $wpdb;
$days_inactive = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"));
// Получаем ID пользователей с ролью subscriber или customer
$args = [
'role__in' => ['subscriber', 'customer'],
'meta_query' => [
[
'key' => 'last_login',
'value' => $date_threshold,
'compare' => '<',
'type' => 'DATETIME'
]
],
'fields' => 'ID',
'number' => -1
];
$user_query = new WP_User_Query($args);
$users = $user_query->get_results();
foreach ($users as $user_id) {
// Проверяем заказы
$order_count = wc_get_customer_order_count($user_id);
if ($order_count == 0) {
wp_delete_user($user_id);
}
}
}3. Автоматизация через WP-Cron
Чтобы запускать очистку автоматически, добавим планировщик:
if (!wp_next_scheduled('delete_inactive_woocommerce_users_hook')) {
wp_schedule_event(time(), 'daily', 'delete_inactive_woocommerce_users_hook');
}
add_action('delete_inactive_woocommerce_users_hook', 'delete_inactive_woocommerce_users');Проверка результата после внедрения
- Выполните вход под несколькими тестовыми пользователями с разной датой последнего входа, создайте/не создавайте заказы.
- Запустите функцию вручную (например, вызвав
delete_inactive_woocommerce_users();в тестовом режиме). - Проверьте, что удалены только пользователи без заказов и с датой входа старше 180 дней.
- Убедитесь, что роли администратора и менеджера не затронуты.
- Проверьте логи ошибок и базу данных через phpMyAdmin или аналог.
Частые ошибки и как их исправить
- Нет данных о последнем логине: без фиксации даты входа функция ничего не удалит. Решение – добавить хук
wp_loginдля обновления метаполя. - Удаление администраторов: если не указать исключения по ролям, можно потерять важных пользователей. Всегда проверяйте роль перед удалением.
- Неправильный формат даты: убедитесь, что сравнение дат происходит в формате DATETIME, а не строковом.
- Кэширование мешает обновлению: отключите кэширование метаполей или сбрасывайте кэш после обновления.
Практические советы для безопасности и производительности
- Резервное копирование: перед автоматическим удалением обязательно делайте резервную копию базы данных.
- Тестирование на стенде: запускайте функцию сначала на тестовом сайте.
- Логирование действий: добавьте логирование удалённых пользователей для аудита.
- Оптимизация запросов: используйте
WP_User_Queryс мета-запросами, избегайте прямых SQL без необходимости. - Отложенный запуск: если база большая, разбивайте удаление на пакеты по 50-100 пользователей за раз.
Сравнение вариантов реализации автоудаления пользователей
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин сторонний | Простота установки, готовый интерфейс | Может удалить нужных пользователей, нагрузка, нет гибкости | Использовать только проверенные, с возможностью настройки ролей |
| Код с WP_User_Query + Cron | Полный контроль, гибкость, оптимизация | Требует навыков, может быть сложным для новичков | Тестирование и логирование, постепенное внедрение |
| SQL-запросы напрямую | Максимальная скорость | Риск повреждения данных, сложность поддержки | Использовать только с бэкапами и опытным админом |