Почему важно автоматизировать удаление неактивных пользователей в WooCommerce
В магазинах на WooCommerce со временем накапливаются пользователи, которые зарегистрировались, но не проявляли активности (не заходили в аккаунт, не делали заказов). Их большое количество тормозит работу базы, увеличивает нагрузку на сервер и усложняет аналитику. Автоматическое удаление таких учетных записей помогает поддерживать базу данных в порядке и улучшает производительность.
Диагностика: как определить неактивных пользователей WooCommerce
Для начала нужно конкретно определить, что считать неактивным пользователем. Обычно критерии:
- Отсутствие заказов
- Отсутствие входа в личный кабинет более N месяцев (например, 6 месяцев)
- Статус пользователя — клиент (role = customer)
Проверить активность входов можно по мета-данным пользователя или по последнему заказу. Если мета-данных о последнем логине нет, можно добавить их самостоятельно (требуется доработка сайта). Ниже пример SQL-запроса для поиска пользователей без заказов:
SELECT ID, user_login, user_email FROM wp_users WHERE ID NOT IN (SELECT DISTINCT post_author FROM wp_posts WHERE post_type = 'shop_order');Пошаговое решение: автоматическое удаление неактивных пользователей
1. Добавление мета о последнем входе пользователя
Чтобы отслеживать дату последнего входа, добавим хук в functions.php темы или в кастомный плагин:
add_action('wp_login', function($user_login, $user) { update_user_meta($user->ID, 'last_login', current_time('mysql')); }, 10, 2);Это сохранит дату последнего успешного входа в формате MySQL datetime.
2. Создание функции для удаления неактивных пользователей
Функция будет искать пользователей с ролью customer, у которых дата последнего входа старше 6 месяцев и нет заказов.
function wc_delete_inactive_customers() {
global $wpdb;
$threshold_date = date('Y-m-d H:i:s', strtotime('-6 months'));
// Получаем ID пользователей с ролью customer
$customer_ids = $wpdb->get_col(
"SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = '{$wpdb->prefix}capabilities' AND meta_value LIKE '%customer%'");
if (empty($customer_ids)) {
return;
}
foreach ($customer_ids as $user_id) {
$last_login = get_user_meta($user_id, 'last_login', true);
if (!$last_login || $last_login > $threshold_date) {
// Пользователь активен
continue;
}
// Проверяем наличие заказов
$orders = wc_get_orders(array('customer_id' => $user_id, 'limit' => 1));
if (!empty($orders)) {
continue;
}
// Удаляем пользователя
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
}3. Настройка WP-Cron для периодической очистки
Добавим периодическое задание в WP-Cron, чтобы функция запускалась, например, раз в неделю:
add_action('wc_delete_inactive_customers_cron', 'wc_delete_inactive_customers');
if (!wp_next_scheduled('wc_delete_inactive_customers_cron')) {
wp_schedule_event(time(), 'weekly', 'wc_delete_inactive_customers_cron');
}Проверка результата после внедрения
- Проверьте, что у пользователей появляется мета last_login после входа.
- Запустите функцию
wc_delete_inactive_customers()вручную через админ-панель с помощью плагина Code Snippets или WP CLI. - Проверьте, что пользователей с последним входом старше 6 месяцев без заказов удаляет.
- Проверьте логи сервера на ошибки после выполнения cron-задачи.
Частые ошибки и как их исправить
- Нет мета last_login: если пользователи не имеют мета last_login, они не будут удалены. Решение — добавить код для записи даты входа и попросить пользователей войти хотя бы один раз.
- Неправильная роль пользователя: роль клиента может отличаться в кастомных магазинах. Уточните точное значение роли в базе.
- Удаление администраторов или важных пользователей: Обязательно фильтруйте только нужные роли (customer), чтобы не удалить админов.
- WP-Cron не запускается: убедитесь, что на сервере правильно настроен WP-Cron или настройте системный cron для вызова wp-cron.php.
Практические советы по безопасности и производительности
- Перед удалением пользователей создавайте резервные копии базы.
- Если пользователей много, удаляйте партиями, чтобы не перегружать сервер.
- Используйте транзакции и проверяйте успешность удаления.
- Добавьте логирование удалений для аудита.
- При большом количестве пользователей рассмотрите использование WP CLI для запуска скриптов удаления.
Сравнение вариантов реализации автоматического удаления пользователей
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| PHP-скрипт с WP-Cron | Автоматический запуск функции удаления по расписанию | Полный контроль, гибкость, без дополнительных плагинов | Зависит от работоспособности WP-Cron, требует навыков программирования |
| Плагин очистки пользователей | Использование готового плагина для удаления неактивных клиентов | Простота установки, готовое UI | Может быть избыточным, меньше контроля, потенциальные конфликты |
| WP CLI скрипт | Запуск удаления через командную строку | Быстро, эффективно для больших баз | Требует доступа к серверу и навыков CLI |