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

Проблема: накопление неактивных пользователей в WooCommerce

Магазины на WooCommerce часто сталкиваются с задачей очистки базы пользователей от неактивных аккаунтов, которые не совершали покупок и не заходили на сайт длительное время. Это снижает нагрузку на базу, улучшает аналитику и безопасность. Встроенных инструментов для автоматического удаления таких пользователей в WooCommerce нет, поэтому приходится реализовывать собственные решения.

Диагностика: как определить неактивных пользователей

Неактивными считаются пользователи, которые:

  • Не входили на сайт больше определённого срока (например, 6 месяцев);
  • Не совершали заказов;
  • Не имеют важных ролей (например, администратора или менеджера).

Проверить дату последнего входа можно с помощью плагинов или записей в метаполях пользователей, если такая информация ведётся. Заказы доступны через таблицу wp_posts с типом shop_order.

Пошаговое решение: реализация автоудаления неактивных пользователей

1. Добавление фиксации даты последнего входа пользователя

По умолчанию WordPress не сохраняет дату последнего логина, добавим её через хук wp_login:

add_action('wp_login', function($user_login) {
    $user = get_user_by('login', $user_login);
    if ($user) {
        update_user_meta($user->ID, 'last_login', current_time('mysql'));
    }
});

2. Функция очистки неактивных пользователей

Создадим функцию, которая удалит пользователей без заказов и с датой последнего входа старше 180 дней, исключая администраторов:

function delete_inactive_woocommerce_users() {
    global $wpdb;
    $days_inactive = 180;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"));

    // Получаем ID пользователей с ролью subscriber или customer
    $args = [
        'role__in' => ['subscriber', 'customer'],
        'meta_query' => [
            [
                'key' => 'last_login',
                'value' => $date_threshold,
                'compare' => '<',
                'type' => 'DATETIME'
            ]
        ],
        'fields' => 'ID',
        'number' => -1
    ];
    $user_query = new WP_User_Query($args);
    $users = $user_query->get_results();

    foreach ($users as $user_id) {
        // Проверяем заказы
        $order_count = wc_get_customer_order_count($user_id);
        if ($order_count == 0) {
            wp_delete_user($user_id);
        }
    }
}

3. Автоматизация через WP-Cron

Чтобы запускать очистку автоматически, добавим планировщик:

if (!wp_next_scheduled('delete_inactive_woocommerce_users_hook')) {
    wp_schedule_event(time(), 'daily', 'delete_inactive_woocommerce_users_hook');
}
add_action('delete_inactive_woocommerce_users_hook', 'delete_inactive_woocommerce_users');

Проверка результата после внедрения

  • Выполните вход под несколькими тестовыми пользователями с разной датой последнего входа, создайте/не создавайте заказы.
  • Запустите функцию вручную (например, вызвав delete_inactive_woocommerce_users(); в тестовом режиме).
  • Проверьте, что удалены только пользователи без заказов и с датой входа старше 180 дней.
  • Убедитесь, что роли администратора и менеджера не затронуты.
  • Проверьте логи ошибок и базу данных через phpMyAdmin или аналог.

Частые ошибки и как их исправить

  • Нет данных о последнем логине: без фиксации даты входа функция ничего не удалит. Решение – добавить хук wp_login для обновления метаполя.
  • Удаление администраторов: если не указать исключения по ролям, можно потерять важных пользователей. Всегда проверяйте роль перед удалением.
  • Неправильный формат даты: убедитесь, что сравнение дат происходит в формате DATETIME, а не строковом.
  • Кэширование мешает обновлению: отключите кэширование метаполей или сбрасывайте кэш после обновления.

Практические советы для безопасности и производительности

  • Резервное копирование: перед автоматическим удалением обязательно делайте резервную копию базы данных.
  • Тестирование на стенде: запускайте функцию сначала на тестовом сайте.
  • Логирование действий: добавьте логирование удалённых пользователей для аудита.
  • Оптимизация запросов: используйте WP_User_Query с мета-запросами, избегайте прямых SQL без необходимости.
  • Отложенный запуск: если база большая, разбивайте удаление на пакеты по 50-100 пользователей за раз.

Сравнение вариантов реализации автоудаления пользователей

МетодПлюсыМинусыКомпромисс
Плагин стороннийПростота установки, готовый интерфейсМожет удалить нужных пользователей, нагрузка, нет гибкостиИспользовать только проверенные, с возможностью настройки ролей
Код с WP_User_Query + CronПолный контроль, гибкость, оптимизацияТребует навыков, может быть сложным для новичковТестирование и логирование, постепенное внедрение
SQL-запросы напрямуюМаксимальная скоростьРиск повреждения данных, сложность поддержкиИспользовать только с бэкапами и опытным админом
Как запретить индексацию определённых страниц в WordPress
05.03.2026
Как использовать WP-Cron для отложенных задач в WordPress: настройка и отладка
25.06.2026
Автоматическое отключение неиспользуемых плагинов WordPress
20.01.2026
Как сделать автоматический редирект по ролям пользователей в WordPress
02.01.2026
Автоматическое удаление товара из корзины WooCommerce после оплаты
20.07.2026