Диагностика проблемы: зачем и когда удалять неактивных пользователей WooCommerce
В интернет-магазинах на WooCommerce со временем накапливаются пользователи, которые не совершали покупок или не заходили на сайт длительное время. Это увеличивает размер базы данных, замедляет работу сайта и усложняет аналитику. Автоматическое удаление таких пользователей поможет поддерживать базу в чистоте и улучшить производительность.
Как определить неактивных пользователей WooCommerce
Для начала нужно четко определить, кого считать неактивным пользователем. Обычно под этим понимается:
- Пользователи, которые не входили в аккаунт более
nдней (например, 180 дней); - Пользователи без совершённых заказов;
- Пользователи без активности (комментариев, просмотров и т.п.) на сайте.
WooCommerce хранит дату последнего входа в мета-поле last_login только если установлен специальный плагин. По умолчанию WordPress не хранит дату входа пользователя. Поэтому удобнее ориентироваться на дату регистрации и заказы.
Пример запроса для поиска пользователей без заказов и старше 180 дней:
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 180 DAY);Пошаговое решение: автоматическое удаление неактивных пользователей через WP-CLI и WP Cron
Самый надежный способ — делать удаление через WP-CLI, вызываемый по расписанию через CRON. Это безопасно и не перегружает сайт.
1. Создаём PHP-функцию для удаления неактивных пользователей
function wp1_delete_inactive_woocommerce_users() {
global $wpdb;
$days_inactive = 180; // Порог неактивности в днях
// Получаем ID пользователей без заказов старше $days_inactive дней
$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 < DATE_SUB(NOW(), INTERVAL %d DAY)",
$days_inactive
));
foreach ($user_ids as $user_id) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
}
return count($user_ids); // Возвращаем число удалённых
}2. Добавляем WP-CLI команду для вызова функции
if (defined('WP_CLI') && WP_CLI) {
WP_CLI::add_command('wp1 delete-inactive-users', function() {
$deleted = wp1_delete_inactive_woocommerce_users();
WP_CLI::success("Удалено пользователей: {$deleted}");
});
}3. Настраиваем системный CRON для регулярного запуска
В консоли сервера добавьте задачу, например, запуск раз в неделю:
0 3 * * 1 /usr/bin/wp wp1 delete-inactive-users --path=/путь/к/вашему/сайту --quietПроверка результата после внедрения
- Запустите команду вручную:
wp wp1 delete-inactive-users. В консоли увидите число удалённых пользователей. - Проверьте базу данных: убедитесь, что пользователи действительно удалены из таблицы
wp_usersи связанных таблиц. - Проверьте логи WooCommerce и сайта на наличие ошибок после удаления.
- Отслеживайте производительность сайта и размер базы данных через инструменты типа phpMyAdmin или плагинов мониторинга.
Частые ошибки и как их исправить
- Удаление пользователей с заказами: Если логика удаления не учитывает статус заказов, можно случайно удалить активных клиентов. Всегда фильтруйте по статусу заказа
wc-completedиwc-processing. - Ошибка при вызове wp_delete_user: Проверьте, что подключен файл
wp-admin/includes/user.php. Если функция не найдена, удаление не сработает. - CRON не запускается: Убедитесь в правильности пути до WP-CLI и прав пользователя, под которым запускается задача.
- Удаление не происходит из-за кеширования: Очистите кеш сайта и базы данных, если используется кеширование объектов.
Практические советы по безопасности и производительности
- Перед запуском автоматического удаления сделайте резервную копию базы данных.
- Добавьте логирование удалённых пользователей в отдельный файл для аудита.
- Не удаляйте пользователей мгновенно, а переносите их в отдельную роль или мета-флаг для «заморозки» на месяц, чтобы избежать потери клиентов по ошибке.
- Оптимизируйте запросы к базе, используйте индексы по дате регистрации и авторству заказов.
- Для больших баз лучше разбивать удаление на партии по 100-200 пользователей за раз, чтобы избежать таймаутов.
Сравнение вариантов решения удаления неактивных пользователей
| Метод | Плюсы | Минусы | Подходит для |
|---|---|---|---|
| WP-CLI с CRON | Надежно, быстро, без нагрузки на фронт | Требует доступа к серверу и навыков командной строки | Средние и крупные магазины |
| Плагин с автоочисткой | Просто настроить, без кода | Может замедлять сайт, ограниченные настройки | Малые магазины, начинающие |
| Ручное удаление через админку | Простой контроль | Трудозатратно при большом количестве | Малые сайты, разовые случаи |