Диагностика проблемы: зачем и когда удалять неактивных клиентов
На крупных интернет-магазинах WooCommerce с длительной историей часто накапливаются тысячи пользователей, которые зарегистрировались, но никогда не совершали покупок или давно не заходили в свой аккаунт. Это увеличивает размер базы данных, замедляет работу сайта и усложняет аналитику. Автоматическое удаление таких неактивных клиентов снижает нагрузку и поддерживает актуальность базы.
Критерии неактивности обычно включают:
- Отсутствие заказов;
- Отсутствие активности на сайте длительное время (например, 1 год);
- Отсутствие входа в аккаунт.
Важно не удалять администраторов и полезных клиентов, поэтому требуется точная фильтрация.
Как определить неактивных пользователей в WooCommerce
WooCommerce хранит пользователей в таблице wp_users, а заказы — в wp_posts с типом shop_order. Активность пользователя можно оценить по следующим параметрам:
- Дата последнего заказа — поле
post_dateв заказах пользователя; - Дата последнего входа — если есть плагин или кастомное поле, иначе придется использовать дату регистрации;
- Роль пользователя — чтобы не удалять администраторов.
Пример запроса для поиска пользователей без заказов и без активности более года
SELECT u.ID FROM wp_users u
LEFT JOIN wp_posts p ON p.post_author = u.ID AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing')
WHERE p.ID IS NULL
AND u.user_registered < DATE_SUB(NOW(), INTERVAL 1 YEAR)
AND u.ID NOT IN (SELECT user_id FROM wp_usermeta WHERE meta_key = 'wp_capabilities' AND meta_value LIKE '%administrator%');
Пошаговое решение: скрипт для автоматического удаления неактивных клиентов
Для автоматизации используем WP-CLI или PHP-скрипт с хуком wp_loaded и планировщиком задач WordPress (WP-Cron).
Пример функции удаления неактивных пользователей по критериям
function wc_delete_inactive_customers() {
global $wpdb;
$date_limit = date('Y-m-d H:i:s', strtotime('-1 year'));
// Получаем ID пользователей без заказов и с датой регистрации < 1 год назад, исключая администраторов
$user_ids = $wpdb->get_col($wpdb->prepare(
"SELECT u.ID FROM {$wpdb->users} u
LEFT JOIN {$wpdb->posts} p ON p.post_author = u.ID AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing')
WHERE p.ID IS NULL AND u.user_registered < %s
AND u.ID NOT IN (
SELECT user_id FROM {$wpdb->usermeta}
WHERE meta_key = %s AND meta_value LIKE %s
)",
$date_limit,
$wpdb->esc_like('wp_capabilities'),
'%administrator%'
));
if (empty($user_ids)) {
return 'No inactive users found.';
}
foreach ($user_ids as $user_id) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
}
return count($user_ids) . ' inactive users deleted.';
}
// Регистрация WP-Cron задачи
add_action('wc_delete_inactive_customers_daily', 'wc_delete_inactive_customers');
if (!wp_next_scheduled('wc_delete_inactive_customers_daily')) {
wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_daily');
}
Этот код удалит пользователей, которые не сделали ни одного заказа, зарегистрированы более года назад и не являются администраторами. Для запуска немедленно можно вызвать функцию напрямую через WP-CLI или добавить временно вызов в functions.php.
Проверка результата после внедрения
- Проверьте список пользователей в админке WooCommerce — не должно быть удалённых клиентов, которые делали заказы.
- Запустите SQL-запрос для проверки пользователей без заказов и убедитесь, что их осталось меньше.
- Просмотрите лог WP-Cron (плагин WP Crontrol или аналог) — должна появляться задача
wc_delete_inactive_customers_dailyи успешные выполнения. - Тестируйте на копии сайта, чтобы избежать потери данных.
Частые ошибки и как их исправить
- Удаление нужных пользователей: Неправильно настроенный фильтр ролей — проверяйте условие исключения администраторов и других ролей.
- Пользователи с заказами удаляются: Проверьте статус заказов, иногда заказы не в статусах
wc-completedилиwc-processing, добавьте нужные статусы. - WP-Cron не срабатывает: На некоторых серверах WP-Cron отключён, настройте системный cron или запускайте вручную через WP-CLI.
- Ошибка при удалении пользователя: Убедитесь, что подключен файл
wp-admin/includes/user.phpи права доступа корректны.
Практические советы по безопасности и производительности
- Перед автоматическим удалением сделайте резервную копию базы данных.
- Запускайте удаление в низкую нагрузку сервера, чтобы избежать таймаутов.
- Используйте WP-CLI для массовых операций — быстрее и безопаснее.
- Логируйте удалённые ID пользователей для аудита.
- Если много пользователей, разбивайте удаление на партии по 50–100, чтобы не перегружать сервер.
Сравнение способов удаления неактивных клиентов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + PHP-скрипт (как в статье) | Полный контроль, бесплатно, настраиваемая логика | Зависит от WP-Cron, требует навыков программирования |
| Плагин очистки пользователей | Простота настройки, интерфейс | Может не учитывать все нюансы, нагрузка на сайт |
| WP-CLI скрипт | Высокая производительность, можно запускать вручную | Требует доступа к серверу, командной строки |