Диагностика проблемы: зачем удалять неактивных клиентов в WooCommerce
В интернет-магазинах на WooCommerce база клиентов со временем растёт, но не все пользователи остаются активными. Неактивные клиенты — это пользователи, которые не делали заказов или не заходили в личный кабинет длительное время (например, 1 год). Их хранение увеличивает размер базы данных, может замедлять запросы и усложнять аналитику. Автоматическое удаление таких пользователей помогает поддерживать базу в актуальном состоянии и улучшить производительность.
Критерии определения неактивных клиентов
Для удаления будем ориентироваться на два параметра:
- Дата последнего заказа клиента — если заказов нет или последний заказ старше заданного срока.
- Дата последнего входа в аккаунт — если пользователь не авторизовался в течение длительного времени.
В WooCommerce данные о заказах хранятся в таблице wp_posts с типом shop_order, связь с пользователем через мета-поле _customer_user. Дату последнего входа можно хранить самостоятельно с помощью хуков авторизации.
Пошаговое решение: автоматическое удаление неактивных клиентов
1. Отслеживание даты последнего входа пользователя
WordPress не хранит дату последнего входа по умолчанию, добавим сохранение этой даты в мета-поле пользователя при каждой авторизации:
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}, 10, 2);2. Функция для поиска неактивных клиентов
Определим функцию, которая вернёт ID пользователей с ролью customer, у которых нет заказов или последний заказ старше 365 дней, а также дата последнего входа больше 365 дней назад или отсутствует.
function get_inactive_customers($days = 365) {
global $wpdb;
$date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем всех клиентов
$customers = get_users([
'role' => 'customer',
'fields' => ['ID'],
]);
$inactive_ids = [];
foreach ($customers as $user_id) {
// Дата последнего входа
$last_login = get_user_meta($user_id, 'last_login', true);
if (!$last_login || $last_login < $date_limit) {
// Получаем последний заказ пользователя
$last_order_date = $wpdb->get_var($wpdb->prepare(
"SELECT MAX(post_date) FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-processing') AND ID IN (SELECT post_id FROM {$wpdb->prefix}postmeta WHERE meta_key = '_customer_user' AND meta_value = %d)",
$user_id
));
if (!$last_order_date || $last_order_date < $date_limit) {
$inactive_ids[] = $user_id;
}
}
}
return $inactive_ids;
}3. Удаление неактивных клиентов
Добавим функцию очистки, которая удалит пользователей по ID и логирует результат:
function delete_inactive_customers($days = 365) {
$inactive_users = get_inactive_customers($days);
foreach ($inactive_users as $user_id) {
wp_delete_user($user_id);
}
return $inactive_users;
}4. Запуск удаления по расписанию (WP Cron)
Для автоматизации создадим событие, которое будет запускаться раз в неделю:
if (!wp_next_scheduled('weekly_inactive_customer_cleanup')) {
wp_schedule_event(time(), 'weekly', 'weekly_inactive_customer_cleanup');
}
add_action('weekly_inactive_customer_cleanup', function() {
$deleted = delete_inactive_customers(365);
if (!empty($deleted)) {
error_log('Removed inactive customers: ' . implode(', ', $deleted));
}
});Проверка результата после внедрения
- Проверьте, что при логине пользователя в мета-поле
last_loginобновляется дата черезget_user_meta($user_id, 'last_login', true). - Запустите вручную функцию
delete_inactive_customers(365)через WP-CLI или временно вызовите в коде, чтобы проверить, возвращаются ли ID пользователей для удаления. - Проверьте логи (error_log), чтобы убедиться, что удаление произошло и зафиксировано.
- В базе данных убедитесь, что удалённые пользователи отсутствуют в таблице
wp_users.
Частые ошибки и как их исправить
- Не обновляется дата последнего входа: проверьте, что хук
wp_loginзарегистрирован корректно и функция получает оба параметра ($user_loginи$user). - Удаляются активные пользователи: проверьте правильность условий в функции
get_inactive_customers, особенно даты и статусы заказов. - WP Cron не срабатывает: убедитесь, что на сайте есть трафик, запускающий WP Cron, или настройте системный cron для wp-cron.php.
- Пользователи не удаляются: проверьте права пользователя, под которым запускается код, и работу функции
wp_delete_user.
Практические советы по безопасности и производительности
- Перед удалением пользователей сделайте резервную копию базы данных.
- Добавьте журналирование действий удаления для аудита через
error_logили отдельную таблицу. - Не удаляйте пользователей сразу — можно сначала пометить их мета-полем, а затем удалять через несколько дней.
- Оптимизируйте запросы к базе, особенно если клиентов много, разбивайте обработку по частям.
Таблица сравнения вариантов реализации удаления неактивных клиентов
| Метод | Плюсы | Минусы |
|---|---|---|
| Использование плагина (например, WP User Manager) | Простота настройки, графический интерфейс, поддержка | Дополнительная нагрузка, возможные конфликты, платные функции |
| Код на основе WP Cron и функций WordPress | Гибкость, полное управление, отсутствие сторонних зависимостей | Требует знаний PHP, нужно тестировать и поддерживать |
| Удаление вручную через SQL-запросы | Быстрая массовая очистка | Риск повреждения данных, требует осторожности, отсутствует логика |