Диагностика проблемы: зачем и когда отключать неактивных клиентов в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливается множество клиентов, которые либо не совершали покупок долгое время, либо вообще зарегистрировались, но не активировались. Это приводит к раздуванию базы данных, увеличению нагрузки и усложнению работы с клиентской базой. Автоматическое отключение таких пользователей позволяет поддерживать актуальность данных и оптимизировать работу сайта.
Как определить неактивного клиента
- Отсутствие заказов за определённый период (например, 6 месяцев).
- Отсутствие входа в аккаунт за этот же период.
- Отсутствие активности на сайте (комментарии, просмотры, если ведётся учёт).
Для большинства случаев достаточно проверять дату последнего заказа и дату последнего логина.
Пошаговое решение: автоматическое отключение пользователей с помощью крон-задачи и хуков
1. Добавление пользовательского крона
Создадим собственное событие, которое будет запускаться ежедневно и проверять пользователей.
add_filter('cron_schedules', function($schedules) {
if (!isset($schedules['daily'])) {
$schedules['daily'] = [
'interval' => 86400, // 24 часа
'display' => __('Каждый день')
];
}
return $schedules;
});
if (!wp_next_scheduled('wpd_deactivate_inactive_customers')) {
wp_schedule_event(time(), 'daily', 'wpd_deactivate_inactive_customers');
}2. Обработка отключения пользователей
Добавим функцию, которая будет искать клиентов без активности за последние 180 дней и менять их роль на inactive_customer (рекомендуется создавать отдельную роль или менять статус пользователя).
add_action('wpd_deactivate_inactive_customers', function() {
$inactive_days = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$inactive_days} days"));
$args = [
'role' => 'customer',
'meta_query' => [
'relation' => 'OR',
[
'key' => 'last_login',
'value' => $date_threshold,
'compare' => '<=',
'type' => 'DATETIME'
],
[
'key' => '_last_order_date',
'value' => $date_threshold,
'compare' => '<=',
'type' => 'DATETIME'
]
],
'fields' => 'ID',
'number' => -1
];
$user_query = new WP_User_Query($args);
$users = $user_query->get_results();
foreach ($users as $user_id) {
$user = new WP_User($user_id);
// Меняем роль
$user->set_role('inactive_customer');
}
});3. Отслеживание времени последнего входа и заказа
Для работы кода нам нужно сохранять дату последнего входа и последнего заказа пользователя. Для этого используем следующие хуки:
add_action('wp_login', function($user_login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}, 10, 2);
add_action('woocommerce_thankyou', function($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'));
}
});Проверка результата после внедрения
- Проверьте наличие запланированного задания в разделе «Инструменты» – «Cron Events» (если установлен плагин WP Crontrol).
- Создайте тестового пользователя с ролью
customerи без активности более 180 дней (можно вручную установить мета-данныеlast_loginи_last_order_dateна дату старше 180 дней). - Запустите событие крон вручную через WP Crontrol или временно вызовите функцию напрямую.
- Проверьте, что роль пользователя изменилась на
inactive_customer.
Частые ошибки и как их исправить
- Роль
inactive_customerне создана: добавьте её в WordPress с помощьюadd_roleперед использованием. - Пользователи не деактивируются: проверьте, что мета-данные
last_loginи_last_order_dateобновляются корректно. - Крон не запускается: на хостинге может быть отключён WP-Cron. Настройте системный cron на вызов
wp-cron.php. - Неверный формат даты в запросе: используйте
current_time('mysql')для сохранения даты в формате MySQL.
Практические советы по безопасности и производительности
- Создавайте отдельную роль
inactive_customerс минимальными правами, чтобы избежать случайного доступа. - Добавьте логирование отключений в отдельный файл или системный журнал для аудита.
- Для больших баз данных используйте WP_User_Query с пагинацией, чтобы не превышать лимит памяти.
- Оптимизируйте запросы и хранение даты последнего входа через мета-данные, чтобы избежать дополнительных нагрузок.
Сравнение способов реализации
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин автоматической очистки клиентов | Простой запуск, готовое решение | Может быть тяжеловесным, не всегда гибкий | Использовать для небольших сайтов |
| Своя реализация на хуках и WP-Cron | Полный контроль, кастомизация | Нужны знания разработки, настройка cron | Оптимально для крупных и уникальных проектов |
| Ручное отключение через админку | Простота, без кода | Трудозатратно, не автоматизировано | Подходит для мелких магазинов |