Диагностика проблемы: зачем удалять неактивных клиентов в WooCommerce
Если ваш интернет-магазин на WooCommerce работает долго, база пользователей постепенно растёт. Среди них есть клиенты, которые давно не совершали покупок и не заходили в свой аккаунт. Такие «мёртвые» пользователи занимают место в базе данных, увеличивают размер бэкапов и могут замедлять работу сайта, особенно если вы используете расширенные фильтры или интеграции с CRM.
Кроме того, с точки зрения GDPR и оптимизации маркетинговых кампаний полезно периодически очищать базу от неактивных клиентов. Но ручное удаление невозможно при тысячах пользователей, поэтому нужна автоматизация.
Как определить неактивного клиента в WooCommerce
Под неактивным клиентом будем понимать пользователя с ролью customer или subscriber, который не заходил в личный кабинет более определённого периода (например, 1 год) и не совершал заказов в этот период.
Для решения задачи понадобится проверять два параметра по пользователю:
- Дата последнего входа (user_last_login или user_registered + usermeta с последним логином)
- Дата последнего заказа
Стандартно WordPress не хранит дату последнего входа, поэтому её нужно записывать самостоятельно, либо использовать мета-данные заказов для анализа активности.
Пошаговое решение: автоматическое удаление неактивных клиентов
1. Отслеживание даты последнего входа пользователя
Добавим хук, который будет сохранять дату последнего входа в пользовательские мета-данные last_login:
add_action('wp_login', 'update_last_login_meta', 10, 2);
function update_last_login_meta($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
2. Получение даты последнего заказа пользователя
Используем встроенные функции WooCommerce для получения даты последнего заказа пользователя:
function get_user_last_order_date($user_id) {
$orders = wc_get_orders(array(
'customer_id' => $user_id,
'limit' => 1,
'orderby' => 'date',
'order' => 'DESC',
'return' => 'ids',
));
if (empty($orders)) {
return false;
}
$order = wc_get_order($orders[0]);
return $order->get_date_created() ? $order->get_date_created()->date('Y-m-d H:i:s') : false;
}
3. Создание функции удаления неактивных клиентов
Ниже пример функции, которая ищет пользователей с ролью customer, у которых последний вход или заказ был более 365 дней назад, и удаляет их.
function delete_inactive_customers() {
$threshold_days = 365; // Порог в днях
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $threshold_days . ' days'));
$args = array(
'role' => 'customer',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'last_login',
'value' => $date_threshold,
'compare' => '<',
'type' => 'DATETIME',
),
array(
'key' => 'last_login',
'compare' => 'NOT EXISTS',
),
),
'fields' => 'ID',
'number' => -1
);
$users = get_users($args);
foreach ($users as $user_id) {
$last_order_date = get_user_last_order_date($user_id);
if ($last_order_date === false || $last_order_date < $date_threshold) {
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
}
}
4. Автоматизация с помощью WP-Cron
Чтобы запускать очистку регулярно, добавим крон-задачу:
if (!wp_next_scheduled('wc_delete_inactive_customers_daily')) {
wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_daily');
}
add_action('wc_delete_inactive_customers_daily', 'delete_inactive_customers');
Проверка результата после внедрения
- Проверьте, что у пользователей после входа в их профиль появляется мета-ключ
last_loginс актуальной датой. Для этого можно использовать плагин типа User Meta Manager или запрос к базе. - Создайте тестового пользователя, у которого последний вход и последний заказ были более года назад (можно вручную изменить метаданные через базу или WP CLI).
- Запустите функцию
delete_inactive_customers()вручную (через WP CLI или временно добавив вызов в functions.php), и убедитесь, что этот пользователь удалён. - Проверьте логи сервера и ошибки, чтобы убедиться, что ошибок удаления нет.
Частые ошибки и как их исправить
- Отсутствие данных last_login. Если пользователи не заходили с момента внедрения хука, у них не будет мета-ключа. В этом случае добавляем в запрос пользователей без last_login — они считаются неактивными.
- Удаление администраторов. Критически важно фильтровать по роли
customer, чтобы не удалить админов или редакторов. - Проблемы с правами. Убедитесь, что wp_delete_user вызывается в контексте с достаточными правами (например, из админки или WP-CLI).
- Частые вызовы WP-Cron. WP-Cron зависит от посещений сайта. При низком трафике задачи могут запускаться нерегулярно. Для надёжности используйте системный cron и wp-cron.php.
Практические советы по безопасности и производительности
- Перед массовым удалением всегда делайте бэкап базы данных.
- Рассмотрите возможность добавления логирования удалённых пользователей для аудита.
- Чтобы снизить нагрузку, обрабатывайте пользователей порциями, например, по 50 за раз, если база большая.
- Используйте WP-CLI для запуска таких задач вне пиковых нагрузок.
- Если в магазине много клиентов, можно добавить подтверждение удаления через email или двуступенчатую очистку.
Сравнение подходов: плагин vs собственный код
| Критерий | Плагин | Собственный код | Компромисс |
|---|---|---|---|
| Гибкость | Ограничена настройками | Полный контроль | Встроить API плагина в свой код |
| Обновления | Автоматические | Нужно поддерживать | Использовать проверенные плагины с хуками |
| Производительность | Может нагружать сайт | Оптимизируем самостоятельно | Писать код с пакетной обработкой |
| Безопасность | Возможны уязвимости | Контроль над кодом | Аудит кода и тестирование |