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

Диагностика проблемы: зачем удалять неактивных клиентов в WooCommerce?

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

Если вы заметили, что в вашей базе много пользователей, которые не заходили на сайт и не покупали товары в течение нескольких месяцев или лет, стоит задуматься об их автоматическом удалении.

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

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

Пошаговое решение: автоматическое удаление неактивных клиентов через WP-Cron

Для реализации задачи используем WP-Cron — встроенный планировщик задач WordPress, чтобы регулярно запускать скрипт, который будет удалять пользователей, соответствующих критериям неактивности.

1. Создаем функцию для выборки и удаления неактивных клиентов

function wc_delete_inactive_customers() {
    $months_inactive = 6; // Период неактивности в месяцах
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$months_inactive} months"));

    // Получаем пользователей с ролью 'customer'
    $args = [
        'role' => 'customer',
        'fields' => ['ID'],
        'meta_query' => [
            [
                'key' => 'last_login', // Кастомное поле для последнего входа
                'value' => $date_threshold,
                'compare' => '<',
                'type' => 'DATETIME'
            ]
        ]
    ];

    $user_query = new WP_User_Query($args);
    $users = $user_query->get_results();

    if (!empty($users)) {
        foreach ($users as $user_id) {
            // Проверяем, есть ли заказы у пользователя
            $orders = wc_get_orders([
                'customer_id' => $user_id,
                'limit' => 1
            ]);
            if (empty($orders)) {
                // Удаляем пользователя без заказов и с неактивным логином
                wp_delete_user($user_id);
            }
        }
    }
}

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

2. Отслеживаем последний вход пользователя

Добавим хук для сохранения времени входа пользователя в метаполе last_login:

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

3. Запускаем функцию удаления по расписанию

Добавим задание в WP-Cron, которое будет запускать нашу функцию раз в сутки:

function wc_schedule_inactive_customer_deletion() {
    if (!wp_next_scheduled('wc_daily_delete_inactive_customers')) {
        wp_schedule_event(time(), 'daily', 'wc_daily_delete_inactive_customers');
    }
}
add_action('wp', 'wc_schedule_inactive_customer_deletion');

add_action('wc_daily_delete_inactive_customers', 'wc_delete_inactive_customers');

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

  • Убедитесь, что у пользователей есть метаполе last_login с правильными датами (через phpMyAdmin или плагин User Meta Manager).
  • Запустите функцию вручную для теста, вызвав wc_delete_inactive_customers() в консоли WP CLI или временно через админку.
  • Проверьте, что после запуска удалились пользователи без заказов и с датой последнего входа старше 6 месяцев.
  • Проверьте логи сервера и ошибок WordPress на предмет возможных ошибок.

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

  • Отсутствует метаполе last_login: без него функция не может определить неактивных пользователей. Решение — добавить хук для сохранения даты входа.
  • Удаляются администраторы или важные роли: в запросе фильтруйте только роль 'customer'.
  • WP-Cron не срабатывает: частая проблема на хостингах без трафика. Настройте системный cron или запускайте WP-Cron вручную.
  • Пользователи с заказами удаляются: проверьте корректность выборки заказов через wc_get_orders. Обычно важен параметр customer_id и статус заказа.

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

  • Перед удалением пользователей делайте резервные копии базы данных.
  • Для больших баз разделяйте удаление на части, чтобы не перегружать сервер (например, обрабатывать по 50 пользователей за раз).
  • Не удаляйте пользователей с ролью выше customer, например, shop_manager или administrator.
  • Используйте системный cron вместо WP-Cron для надежности на живом сайте.
  • Логируйте действия удаления в отдельный файл для аудита.

Сравнение способов реализации автоматического удаления неактивных клиентов

МетодПлюсыМинусыКомпромисс
Собственный код с WP-CronМаксимальный контроль, нет зависимостейНужно писать и тестировать код, требуется настройка метаполейИспользовать вместе с плагином для отслеживания last_login
Плагины очистки пользователей (например, WP Bulk Delete)Простота настройки, поддержка интерфейсаМеньше гибкости, возможна нагрузка при больших объемахПодходит для небольших магазинов
Удаление вручную через SQL-запросыБыстро и напрямуюРиск ошибок и потери данных, нет автоматизацииИспользовать только для разовых чисток с бэкапом
Как создать собственный REST API в WordPress
13.11.2025
Как создать динамический блок с помощью AJAX в WordPress
19.12.2025
Как создать автоматический импорт данных из Google Sheets в WordPress
14.01.2026
WooCommerce: автоматическое удаление неоплаченных заказов по расписанию
22.07.2026
Как добавить автоматический режим работы плагинов WordPress
28.01.2026