Диагностика проблемы: зачем удалять неактивных клиентов в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливается большое количество пользователей, которые зарегистрировались, но не делали заказов в течение длительного времени. Это увеличивает нагрузку на базу данных и снижает качество сегментации клиентов для маркетинга. Удаление неактивных клиентов помогает поддерживать базу в актуальном состоянии и экономит ресурсы.
Как определить неактивного клиента
Типичный критерий — отсутствие заказов за определённый период, например, 12 месяцев. Также можно учитывать дату последнего входа в систему, если ведётся учёт.
Пошаговое решение: автоматическое удаление неактивных клиентов с помощью WP CLI и WP Cron
Реализуем задачу с помощью пользовательской функции и планировщика задач WordPress, без сторонних плагинов.
1. Создаём функцию удаления пользователей
function wc_delete_inactive_customers() {
$period = 365; // дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$period} days"));
// Получаем пользователей с ролью 'customer' без заказов за период
$args = [
'role' => 'customer',
'meta_query' => [
'relation' => 'OR',
[
'key' => '_last_order_date',
'value' => $date_threshold,
'compare' => '<',
'type' => 'DATETIME'
],
[
'key' => '_last_order_date',
'compare' => 'NOT EXISTS'
]
]
];
$users = get_users($args);
foreach ($users as $user) {
// Проверяем заказы пользователя
$orders = wc_get_orders([
'customer_id' => $user->ID,
'limit' => 1,
'orderby' => 'date',
'order' => 'DESC'
]);
if (empty($orders)) {
// Удаляем пользователя без заказов
wp_delete_user($user->ID);
} else {
$last_order = reset($orders);
if ($last_order->get_date_created()->date('Y-m-d H:i:s') < $date_threshold) {
wp_delete_user($user->ID);
}
}
}
}2. Регистрируем событие WP Cron для регулярного запуска
if (!wp_next_scheduled('wc_delete_inactive_customers_event')) {
wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_event');
}
add_action('wc_delete_inactive_customers_event', 'wc_delete_inactive_customers');3. Добавляем мета-обновление даты последнего заказа
Чтобы оптимизировать выборку, обновляем мета-поле _last_order_date при каждом новом заказе:
add_action('woocommerce_thankyou', function($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$user_id = $order->get_user_id();
if ($user_id) {
update_user_meta($user_id, '_last_order_date', $order->get_date_created()->date('Y-m-d H:i:s'));
}
});Проверка результата
- Запустите функцию вручную через WP CLI:
wp eval 'wc_delete_inactive_customers();'— проверьте, что неактивные клиенты удаляются. - Проверьте, что планировщик срабатывает:
wp cron event listдолжен содержатьwc_delete_inactive_customers_event. - В базе данных пользователи с ролью 'customer', у которых нет заказов или заказы старше 365 дней, должны быть удалены.
Частые ошибки и как их исправить
- Пользователи не удаляются: проверьте правильность ролей и наличие мета-полей, убедитесь, что функция вызывается (например, через WP CLI).
- Планировщик задач не запускается: убедитесь, что у вас правильно настроен WP Cron (если сайт с низким трафиком, WP Cron может не запускаться автоматически).
- Удаляются не те пользователи: проверьте логику даты и сравнения, используйте дебаг с
error_log()для вывода ID пользователей перед удалением.
Практические советы по безопасности и производительности
- Перед массовым удалением сделайте резервную копию базы данных.
- Ограничьте количество пользователей, удаляемых за один запуск, чтобы избежать таймаутов. Например, добавьте параметр
'number' => 50вget_users. - Для крупных баз используйте WP CLI скрипт с пагинацией для пакетной обработки.
- Добавьте логирование удалённых пользователей для аудита.
- Не удаляйте пользователей с другими ролями и правами — проверяйте роль
customer.
Сравнение способов удаления неактивных клиентов
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Код с WP Cron и хуками (как в статье) | Без плагинов, гибко, масштабируемо | Нужны базовые знания PHP, настройка WP Cron | Средние и крупные магазины с контролем процесса |
| Плагины удаления пользователей (User Cleaner и др.) | Простота, GUI | Могут конфликтовать, лишний код | Маленькие магазины, без разработчика |
| Ручное удаление через админку | Просто, без кода | Трудозатратно, риск ошибок | Очень маленькие проекты |