Диагностика проблемы: зачем удалять неактивных клиентов
В интернет-магазинах на WooCommerce база пользователей со временем разрастается. Среди них появляются клиенты, которые давно не совершали покупки и не заходили на сайт. Такая «мусорная» база влияет на производительность, увеличивает размер базы данных и усложняет аналитику. Удаление неактивных клиентов помогает поддерживать базу в актуальном состоянии и оптимизировать работу сайта.
Как определить неактивного клиента в WooCommerce
Чаще всего под неактивным клиентом понимают пользователя, который:
- Не совершал покупок в течение заданного периода (например, 6 месяцев);
- Не заходил в свой аккаунт;
- Не проявлял активности (отсутствие заказов, отзывов и т.п.).
Для автоматизации удаления нужно иметь критерии и способ их проверки.
Пошаговое решение: как автоматически удалять неактивных клиентов
1. Создаем WP-Cron задачу для регулярной проверки
Добавим в functions.php или в кастомный плагин периодическую задачу, которая будет запускаться, например, раз в неделю.
if ( ! wp_next_scheduled( 'remove_inactive_customers_weekly' ) ) {
wp_schedule_event( time(), 'weekly', 'remove_inactive_customers_weekly' );
}
2. Определяем функцию удаления неактивных пользователей
Функция будет искать пользователей с ролью "customer", у которых нет заказов за последние 180 дней (6 месяцев), и удалять их.
function remove_inactive_customers() {
$cutoff_date = date( 'Y-m-d H:i:s', strtotime( '-180 days' ) );
// Получаем всех клиентов
$args = [
'role' => 'customer',
'fields' => ['ID'],
'meta_query' => [
'relation' => 'OR',
[
'key' => '_last_order_date',
'value' => $cutoff_date,
'compare' => '<',
'type' => 'DATETIME',
],
[
'key' => '_last_order_date',
'compare' => 'NOT EXISTS'
]
]
];
$user_query = new WP_User_Query( $args );
if ( ! empty( $user_query->results ) ) {
foreach ( $user_query->results as $user_id ) {
// Проверяем, есть ли у пользователя заказы после cutoff_date
$orders = wc_get_orders([
'customer_id' => $user_id,
'date_created' => '>' . $cutoff_date,
'limit' => 1
]);
if ( empty( $orders ) ) {
wp_delete_user( $user_id );
}
}
}
}
add_action( 'remove_inactive_customers_weekly', 'remove_inactive_customers' );
3. Оптимизация: кэширование даты последнего заказа
Для ускорения выборки можно сохранить дату последнего заказа пользователя в метаполе "_last_order_date". Это можно делать при оформлении заказа, используя хук woocommerce_thankyou:
function update_last_order_date( $order_id ) {
$order = wc_get_order( $order_id );
$user_id = $order->get_user_id();
if ( $user_id ) {
update_user_meta( $user_id, '_last_order_date', current_time( 'mysql' ) );
}
}
add_action( 'woocommerce_thankyou', 'update_last_order_date' );
Проверка результата
Чтобы убедиться, что система работает:
- Вручную создайте тестового клиента, который не делает заказов больше 6 месяцев (можно установить дату вручную в базе);
- Принудительно запустите задачу WP-Cron с помощью плагина WP Crontrol или WP-CLI:
wp cron event run remove_inactive_customers_weekly
- Проверьте, удалился ли тестовый пользователь;
- Посмотрите логи ошибок и убедитесь, что нет сбоев.
Частые ошибки и как их исправить
- Пользователи не удаляются: проверьте, что задача WP-Cron активна и вызывается. Можно использовать плагин WP Crontrol для мониторинга.
- Удаляются не те пользователи: убедитесь, что критерии фильтрации корректны. Например, метаполе
_last_order_dateдолжно обновляться при каждом заказе. - Производительность падает при большом количестве клиентов: используйте постраничный запуск удаления или делайте проверку и удаление по частям.
- Потеря данных: перед внедрением на живом сайте сделайте резервную копию базы данных.
Практические советы по безопасности и производительности
- Всегда тестируйте на staging-среде перед внедрением на продакшн.
- Не удаляйте клиентов без резервной копии, так как восстановить данные пользователей сложно.
- Используйте WP-CLI для запуска и отладки задач, это быстрее и надежнее.
- Добавьте логирование удалений в отдельный файл для аудита действий.
- Регулярно очищайте WP-Cron от старых задач, чтобы избежать зависаний.
Сравнение способов удаления неактивных клиентов
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, не подходит для большого числа клиентов | WooCommerce - Пользователи - Удалить |
| WP-Cron с кастомным скриптом | Автоматизация, гибкость | Требует настройки, может влиять на производительность при большом объеме | Код из статьи |
| Плагин для очистки базы | Удобство, дополнительные функции (например Clearfy Pro) | Зависимость от стороннего кода, лицензии | Clearfy Pro |