Диагностика проблемы: зачем и когда нужно удалять неактивных клиентов
В интернет-магазинах на WooCommerce база клиентов активно растёт, включая пользователей, которые давно не заходили или не совершали покупки. Хранение таких аккаунтов увеличивает размер базы данных, замедляет работу сайта и усложняет аналитику. Важно вовремя очищать базу, удаляя неактивных пользователей, чтобы поддерживать производительность и актуальность данных.
Как определить неактивного клиента
Типичный критерий — отсутствие входа или покупок в течение определённого периода (например, 6 или 12 месяцев). WooCommerce хранит дату последнего входа в метаполе last_login (если используется соответствующий плагин) или можно ориентироваться на дату последнего заказа клиента.
Если дата последнего входа недоступна, берём дату последнего заказа. Если и её нет — клиент может считаться неактивным с момента регистрации.
Пошаговое решение: автозапуск удаления неактивных клиентов через WP-Cron
1. Создание функции для поиска и удаления неактивных пользователей
Пример кода, который удаляет пользователей, не совершавших заказов и не заходивших на сайт более 180 дней:
function wc_delete_inactive_customers() {
$days_inactive = 180; // Порог неактивности в днях
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"));
// Получаем ID пользователей с ролью 'customer'
$args = [
'role' => 'customer',
'fields' => ['ID', 'user_registered'],
'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) {
$last_order = wc_get_customer_last_order($user->ID, 'completed');
$last_order_date = $last_order ? $last_order->get_date_completed()->date('Y-m-d H:i:s') : null;
// Проверяем дату последнего заказа или дату регистрации
$compare_date = $last_order_date ? $last_order_date : $user->user_registered;
if ($compare_date < $date_threshold) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user->ID);
}
}
}
// Вспомогательная функция получения последнего заказа клиента
function wc_get_customer_last_order($user_id, $status = 'completed') {
$orders = wc_get_orders([
'customer_id' => $user_id,
'limit' => 1,
'orderby' => 'date',
'order' => 'DESC',
'status' => $status,
]);
return !empty($orders) ? $orders[0] : false;
}2. Регистрация WP-Cron задачи для регулярного запуска
Добавим задачу для еженедельного запуска очистки:
function wc_schedule_inactive_customers_cleanup() {
if (!wp_next_scheduled('wc_delete_inactive_customers_hook')) {
wp_schedule_event(time(), 'weekly', 'wc_delete_inactive_customers_hook');
}
}
add_action('wp', 'wc_schedule_inactive_customers_cleanup');
add_action('wc_delete_inactive_customers_hook', 'wc_delete_inactive_customers');Проверка результата после внедрения
- Просмотрите список клиентов в админке (Пользователи > Все пользователи) до и после запуска задачи;
- Для ускоренной проверки временно измените период неактивности на несколько дней и вручную вызовите функцию
wc_delete_inactive_customers()черезwp-cliили временный админ-скрипт; - Проверьте логи сервера для ошибок при удалении пользователей;
- Убедитесь, что удаляются только клиенты с указанными критериями, а остальные остаются.
Частые ошибки и как их исправить
- Неправильная дата последнего заказа: если заказы не имеют статуса
completed, функция не учитывает их. Рекомендуется проверить статус заказов в магазине и при необходимости добавить другие статусы. - Отсутствие WP-Cron запуска: если на сайте мало посещений, WP-Cron может не запускаться. Для гарантированной работы настройте системный cron или запускайте WP-Cron вручную.
- Удаление администраторов или других ролей: убедитесь, что условие
'role' => 'customer'корректно ограничивает выборку только клиентами. - Неочищаемые данные: после удаления пользователя могут оставаться метаданные или заказы. WooCommerce обычно хранит данные заказов, но если нужно полное удаление, потребуется дополнительный код.
Практические советы по безопасности и производительности
- Перед удалением пользователей делайте резервные копии базы данных;
- Добавьте логирование удалённых клиентов для аудита;
- Не запускайте функцию слишком часто — еженедельного запуска достаточно;
- Ограничьте доступ к коду удаления только администраторам;
- При большом количестве клиентов используйте пакетную обработку (например, по 50 пользователей за запуск), чтобы избежать таймаутов.
Сравнение способов реализации удаления неактивных клиентов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин (например, User Cleaner) | Готовое решение, интерфейс, логи | Зависимость от стороннего кода, нагрузка | Использовать, если нет возможности писать код |
| Самописный код с WP-Cron | Контроль, минимальная нагрузка, кастомизация | Требует навыков, возможны ошибки | Рекомендуется для опытных разработчиков |
| Ручное удаление через админку | Простота, безопасность | Трудозатратно, не масштабируется | Подходит для маленьких магазинов |