Диагностика проблемы: зачем удалять неактивных клиентов в WooCommerce?
В больших интернет-магазинах на WooCommerce база пользователей быстро разрастается. Многие клиенты регистрируются, но не совершают покупок длительное время. Наличие таких неактивных аккаунтов ухудшает производительность сайта, увеличивает размер базы данных и усложняет аналитику.
Если вы заметили, что в вашей базе много пользователей, которые не заходили на сайт и не покупали товары в течение нескольких месяцев или лет, стоит задуматься об их автоматическом удалении.
Как определить неактивного клиента?
- Отсутствие заказов за определенный период (например, 6 месяцев).
- Отсутствие активности (входа в аккаунт) за тот же период.
- Не относится к администраторам или другим важным ролям.
Пошаговое решение: автоматическое удаление неактивных клиентов через WP-Cron
Для реализации задачи используем WP-Cron — встроенный планировщик задач WordPress, чтобы регулярно запускать скрипт, который будет удалять пользователей, соответствующих критериям неактивности.
1. Создаем функцию для выборки и удаления неактивных клиентов
function wc_delete_inactive_customers() {
$months_inactive = 6; // Период неактивности в месяцах
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$months_inactive} months"));
// Получаем пользователей с ролью 'customer'
$args = [
'role' => 'customer',
'fields' => ['ID'],
'meta_query' => [
[
'key' => 'last_login', // Кастомное поле для последнего входа
'value' => $date_threshold,
'compare' => '<',
'type' => 'DATETIME'
]
]
];
$user_query = new WP_User_Query($args);
$users = $user_query->get_results();
if (!empty($users)) {
foreach ($users as $user_id) {
// Проверяем, есть ли заказы у пользователя
$orders = wc_get_orders([
'customer_id' => $user_id,
'limit' => 1
]);
if (empty($orders)) {
// Удаляем пользователя без заказов и с неактивным логином
wp_delete_user($user_id);
}
}
}
}Важно! Для работы функции нужно, чтобы у пользователей было сохранено время последнего входа в метаполе last_login. WooCommerce или WordPress по умолчанию этого не делают — ниже расскажу, как это реализовать.
2. Отслеживаем последний вход пользователя
Добавим хук для сохранения времени входа пользователя в метаполе last_login:
function wc_save_last_login($login, $user) {
update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
add_action('wp_login', 'wc_save_last_login', 10, 2);3. Запускаем функцию удаления по расписанию
Добавим задание в WP-Cron, которое будет запускать нашу функцию раз в сутки:
function wc_schedule_inactive_customer_deletion() {
if (!wp_next_scheduled('wc_daily_delete_inactive_customers')) {
wp_schedule_event(time(), 'daily', 'wc_daily_delete_inactive_customers');
}
}
add_action('wp', 'wc_schedule_inactive_customer_deletion');
add_action('wc_daily_delete_inactive_customers', 'wc_delete_inactive_customers');Проверка результата после внедрения
- Убедитесь, что у пользователей есть метаполе
last_loginс правильными датами (через phpMyAdmin или плагин User Meta Manager). - Запустите функцию вручную для теста, вызвав
wc_delete_inactive_customers()в консоли WP CLI или временно через админку. - Проверьте, что после запуска удалились пользователи без заказов и с датой последнего входа старше 6 месяцев.
- Проверьте логи сервера и ошибок WordPress на предмет возможных ошибок.
Частые ошибки и как их исправить
- Отсутствует метаполе
last_login: без него функция не может определить неактивных пользователей. Решение — добавить хук для сохранения даты входа. - Удаляются администраторы или важные роли: в запросе фильтруйте только роль 'customer'.
- WP-Cron не срабатывает: частая проблема на хостингах без трафика. Настройте системный cron или запускайте WP-Cron вручную.
- Пользователи с заказами удаляются: проверьте корректность выборки заказов через
wc_get_orders. Обычно важен параметр customer_id и статус заказа.
Практические советы по безопасности и производительности
- Перед удалением пользователей делайте резервные копии базы данных.
- Для больших баз разделяйте удаление на части, чтобы не перегружать сервер (например, обрабатывать по 50 пользователей за раз).
- Не удаляйте пользователей с ролью выше customer, например, shop_manager или administrator.
- Используйте системный cron вместо WP-Cron для надежности на живом сайте.
- Логируйте действия удаления в отдельный файл для аудита.
Сравнение способов реализации автоматического удаления неактивных клиентов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Собственный код с WP-Cron | Максимальный контроль, нет зависимостей | Нужно писать и тестировать код, требуется настройка метаполей | Использовать вместе с плагином для отслеживания last_login |
| Плагины очистки пользователей (например, WP Bulk Delete) | Простота настройки, поддержка интерфейса | Меньше гибкости, возможна нагрузка при больших объемах | Подходит для небольших магазинов |
| Удаление вручную через SQL-запросы | Быстро и напрямую | Риск ошибок и потери данных, нет автоматизации | Использовать только для разовых чисток с бэкапом |