WooCommerce: автоматическое удаление неактивных пользователей

Почему важно автоматизировать удаление неактивных пользователей в 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
⭐⭐⭐⭐⭐