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

Диагностика проблемы с неактивными пользователями WooCommerce

В интернет-магазинах на WooCommerce со временем накапливается много пользователей, которые зарегистрировались, но давно не заходили или не совершали покупок. Это негативно влияет на производительность базы данных, замедляет рассылки и усложняет аналитику. Часто владельцы магазинов хотят автоматически удалять таких «заброшенных» пользователей, чтобы поддерживать чистоту данных.

Как определить неактивного пользователя?

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

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

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

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

1. Запись времени последнего входа пользователя

Добавим код, который при каждом успешном входе пользователя сохраняет мета-данные с датой и временем:

add_action('wp_login', 'save_last_login_time', 10, 2);
function save_last_login_time($user_login, $user) {
    update_user_meta($user->ID, 'last_login', current_time('mysql'));
}

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

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

function delete_inactive_woocommerce_users() {
    global $wpdb;

    $threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    // Получаем ID пользователей WooCommerce
    $user_ids = get_users(array(
        'role' => 'customer',
        'fields' => 'ID'
    ));

    foreach ($user_ids as $user_id) {
        $last_login = get_user_meta($user_id, 'last_login', true);

        // Проверяем последний заказ пользователя
        $last_order_date = $wpdb->get_var($wpdb->prepare(
            "SELECT MAX(post_date) FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed','wc-processing') AND post_author = %d",
            $user_id
        ));

        // Если нет даты последнего логина, считаем пользователя неактивным
        if (!$last_login) {
            $last_login = '1970-01-01 00:00:00';
        }
        if (!$last_order_date) {
            $last_order_date = '1970-01-01 00:00:00';
        }

        // Проверяем, старше ли даты лимита
        if ($last_login < $threshold && $last_order_date < $threshold) {
            require_once(ABSPATH . 'wp-admin/includes/user.php');
            wp_delete_user($user_id);
        }
    }
}

3. Запуск удаления по расписанию через WP-Cron

Добавим еженедельное задание, чтобы запускать функцию автоматически:

add_action('delete_inactive_users_cron', 'delete_inactive_woocommerce_users');

function setup_delete_inactive_users_cron() {
    if (!wp_next_scheduled('delete_inactive_users_cron')) {
        wp_schedule_event(time(), 'weekly', 'delete_inactive_users_cron');
    }
}
add_action('wp', 'setup_delete_inactive_users_cron');

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

  • Войдите под тестовым пользователем и убедитесь, что мета last_login добавилась в профиль пользователя (через phpMyAdmin или плагин для управления пользователями).
  • Создайте тестового пользователя без логинов и заказов старше 180 дней (можно вручную изменить дату last_login в базе).
  • Запустите функцию delete_inactive_woocommerce_users() вручную (через временный вызов в functions.php) и проверьте, удалился ли пользователь.
  • Проверьте Cron-задания с помощью плагина WP Crontrol, чтобы убедиться, что задача добавлена и срабатывает.

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

  • last_login не сохраняется: Убедитесь, что хук wp_login не переопределяется другими плагинами, и что код добавлен в functions.php активной темы или в плагин.
  • Пользователи не удаляются: Проверьте, что роль пользователя точно customer, и что даты корректно сравниваются в формате Y-m-d H:i:s.
  • Удаляются нужные пользователи: Проверьте логику сравнения дат и настройте порог (180 дней) под свои нужды.
  • Ошибка с wp_delete_user: Убедитесь, что подключен файл wp-admin/includes/user.php перед вызовом.
  • WP-Cron не срабатывает: Настройте вызов cron вручную или через внешние сервисы, если на сервере нет реального cron.

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

  • Резервное копирование: Перед массовым удалением пользователей обязательно сделайте резервную копию базы данных.
  • Логирование удалений: Добавьте ведение логов, чтобы отслеживать, каких пользователей и когда удалили, например, через error_log или отдельный файл.
  • Оптимизация запросов: Используйте готовые функции WordPress для выборки пользователей, избегайте лишних SQL-запросов.
  • Обработка ошибок: Добавьте проверку успешности wp_delete_user и уведомления администратору при неудаче.

Сравнение способов удаления неактивных пользователей

МетодПлюсыМинусы
Ручное удаление через админкуПростота, контрольТрудоемко при большом числе пользователей
Плагин для очистки пользователейУдобство, настройкиДополнительная нагрузка, возможные конфликты
Код с WP-Cron (описанный в статье)Автоматизация, гибкостьНужно писать и тестировать код, возможны ошибки при некорректной логике
Как автоматически удалять пустые категории в WordPress
06.06.2026
Как отключить автообновления в WordPress без риска для сайта
18.03.2026
Как автоматизировать удаление старых записей в WordPress через WP-Cron
23.02.2026
Как создать собственный шорткод WordPress
01.11.2025
WooCommerce: как автоматически удалять неактивных пользователей
30.06.2026