Диагностика проблемы: зачем отключать неактивных клиентов в WooCommerce
В интернет-магазине на WooCommerce с большой базой пользователей нередко накапливаются неактивные аккаунты. Это приводит к увеличению объема данных в базе, замедлению запросов и усложнению сегментации маркетинговых кампаний. Автоматическое отключение (блокировка) таких клиентов помогает оптимизировать работу сайта и повысить безопасность.
Основной критерий неактивности — отсутствие покупок и входов в аккаунт на протяжении заданного времени (например, 6 месяцев). Если в WooCommerce и WordPress нет встроенного функционала для автоматической деактивации пользователей, его нужно реализовать самостоятельно или при помощи кода.
Как определить неактивных клиентов: проверка активности и покупок
Для выявления неактивных клиентов необходимо проверить два параметра:
- Дата последнего входа пользователя в систему (логин). К сожалению, по умолчанию WordPress не сохраняет дату последнего входа. Нужно добавить её через пользовательский мета-поле.
- Дата последнего заказа WooCommerce пользователя.
Без учета даты последнего входа можно ориентироваться только на дату последнего заказа, но это не всегда точно.
Добавление мета-поля с датой последнего входа
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function update_last_login( $login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time( 'mysql' ) );
}
add_action( 'wp_login', 'update_last_login', 10, 2 );Этот хук обновит мета-поле last_login при каждом входе пользователя.
Пошаговое решение: автоматическая деактивация неактивных клиентов
Далее создадим функцию, которая будет находить пользователей, у которых последний заказ и последний логин старше 180 дней, и блокировать их аккаунты.
function deactivate_inactive_customers() {
$inactive_days = 180; // Количество дней неактивности
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$inactive_days} days" ) );
// Получаем пользователей с ролью customer
$args = [
'role' => 'customer',
'meta_query' => [
'relation' => 'OR',
[
'key' => 'last_login',
'value' => $date_threshold,
'compare' => '<',
'type' => 'DATETIME',
],
[
'key' => 'last_login',
'compare' => 'NOT EXISTS',
],
],
'fields' => 'all',
'number' => -1,
];
$users = get_users( $args );
foreach ( $users as $user ) {
// Получаем дату последнего заказа пользователя
$last_order_date = wc_get_customer_last_order_date( $user->ID, 'completed' );
if ( !$last_order_date || strtotime( $last_order_date ) < strtotime( $date_threshold ) ) {
// Пользователь неактивен, деактивируем
update_user_meta( $user->ID, 'account_status', 'deactivated' );
// Дополнительно можно отключить логин, заблокировав пароль
wp_set_password( wp_generate_password(), $user->ID );
}
}
}
// Запускаем функцию раз в день через WP-Cron
if ( ! wp_next_scheduled( 'deactivate_inactive_customers_daily' ) ) {
wp_schedule_event( time(), 'daily', 'deactivate_inactive_customers_daily' );
}
add_action( 'deactivate_inactive_customers_daily', 'deactivate_inactive_customers' );В этом коде:
- Мы получаем всех клиентов, которые не заходили больше 180 дней или у которых отсутствует запись о последнем входе.
- Проверяем дату последнего завершённого заказа.
- Если оба параметра показывают неактивность, меняем статус аккаунта и сбрасываем пароль, чтобы заблокировать вход.
- Настраиваем ежедневное выполнение через WP-Cron.
Проверка результата после внедрения
Чтобы убедиться, что автоматическое отключение работает:
- Вручную создайте тестовый аккаунт с ролью
customer, задайте датуlast_loginи имитируйте отсутствие заказов. - Выполните функцию вручную, вызвав
deactivate_inactive_customers()из консоли или временно добавив вызов вfunctions.php. - Проверьте, что у пользователя в мета-поле
account_statusзначениеdeactivated. - Попробуйте войти под этим пользователем — пароль должен быть изменён.
Частые ошибки и как их исправить
- Отсутствие даты последнего входа: если код для обновления
last_loginне добавлен, фильтр по дате не сработает. Проверьте, что хукwp_loginподключён и работает. - Пользователи с другими ролями: функция ориентирована на роль
customer. Для других ролей нужно менять параметр'role'. - WP-Cron не запускается: на некоторых хостингах WP-Cron требует внешних вызовов или настройки cron-сервера. Проверьте выполнение расписания через плагин WP Crontrol.
- Пользователи не могут восстановить доступ: обязательно настройте процесс восстановления пароля, чтобы заблокированные пользователи могли самостоятельно вернуть доступ.
Практические советы по безопасности и производительности
- Безопасность: сброс пароля при деактивации — хороший способ заблокировать аккаунт, но сохраняйте возможность восстановления через email.
- Производительность: выполнение проверки большого количества пользователей разом может нагружать базу. Для масштабных магазинов стоит разбивать выборку на порции с
pagedи запускать задачу по частям. - Логи и уведомления: добавьте логирование отключений и уведомления администраторам, чтобы отслеживать процесс.
Таблица сравнения вариантов реализации
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код с WP-Cron | Полный контроль, без сторонних плагинов | Требует навыков, настройка cron | Пример выше |
| Плагин для управления пользователями | Простота, интерфейс | Может нагружать сайт, не всегда гибко | Например, User Expire |
| Внешний скрипт и API | Масштабируемо, можно интегрировать CRM | Сложнее в настройке, требует API | Своя интеграция |