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

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

Если ваш интернет-магазин на WooCommerce работает долго, база пользователей постепенно растёт. Среди них есть клиенты, которые давно не совершали покупок и не заходили в свой аккаунт. Такие «мёртвые» пользователи занимают место в базе данных, увеличивают размер бэкапов и могут замедлять работу сайта, особенно если вы используете расширенные фильтры или интеграции с CRM.

Кроме того, с точки зрения GDPR и оптимизации маркетинговых кампаний полезно периодически очищать базу от неактивных клиентов. Но ручное удаление невозможно при тысячах пользователей, поэтому нужна автоматизация.

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

Под неактивным клиентом будем понимать пользователя с ролью customer или subscriber, который не заходил в личный кабинет более определённого периода (например, 1 год) и не совершал заказов в этот период.

Для решения задачи понадобится проверять два параметра по пользователю:

  • Дата последнего входа (user_last_login или user_registered + usermeta с последним логином)
  • Дата последнего заказа

Стандартно WordPress не хранит дату последнего входа, поэтому её нужно записывать самостоятельно, либо использовать мета-данные заказов для анализа активности.

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

1. Отслеживание даты последнего входа пользователя

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

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

2. Получение даты последнего заказа пользователя

Используем встроенные функции WooCommerce для получения даты последнего заказа пользователя:

function get_user_last_order_date($user_id) {
    $orders = wc_get_orders(array(
        'customer_id' => $user_id,
        'limit' => 1,
        'orderby' => 'date',
        'order' => 'DESC',
        'return' => 'ids',
    ));
    if (empty($orders)) {
        return false;
    }
    $order = wc_get_order($orders[0]);
    return $order->get_date_created() ? $order->get_date_created()->date('Y-m-d H:i:s') : false;
}

3. Создание функции удаления неактивных клиентов

Ниже пример функции, которая ищет пользователей с ролью customer, у которых последний вход или заказ был более 365 дней назад, и удаляет их.

function delete_inactive_customers() {
    $threshold_days = 365; // Порог в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $threshold_days . ' days'));

    $args = array(
        'role' => 'customer',
        'meta_query' => array(
            'relation' => 'OR',
            array(
                'key' => 'last_login',
                'value' => $date_threshold,
                'compare' => '<',
                'type' => 'DATETIME',
            ),
            array(
                'key' => 'last_login',
                'compare' => 'NOT EXISTS',
            ),
        ),
        'fields' => 'ID',
        'number' => -1
    );

    $users = get_users($args);

    foreach ($users as $user_id) {
        $last_order_date = get_user_last_order_date($user_id);
        if ($last_order_date === false || $last_order_date < $date_threshold) {
            require_once(ABSPATH . 'wp-admin/includes/user.php');
            wp_delete_user($user_id);
        }
    }
}

4. Автоматизация с помощью WP-Cron

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

if (!wp_next_scheduled('wc_delete_inactive_customers_daily')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_daily');
}
add_action('wc_delete_inactive_customers_daily', 'delete_inactive_customers');

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

  • Проверьте, что у пользователей после входа в их профиль появляется мета-ключ last_login с актуальной датой. Для этого можно использовать плагин типа User Meta Manager или запрос к базе.
  • Создайте тестового пользователя, у которого последний вход и последний заказ были более года назад (можно вручную изменить метаданные через базу или WP CLI).
  • Запустите функцию delete_inactive_customers() вручную (через WP CLI или временно добавив вызов в functions.php), и убедитесь, что этот пользователь удалён.
  • Проверьте логи сервера и ошибки, чтобы убедиться, что ошибок удаления нет.

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

  • Отсутствие данных last_login. Если пользователи не заходили с момента внедрения хука, у них не будет мета-ключа. В этом случае добавляем в запрос пользователей без last_login — они считаются неактивными.
  • Удаление администраторов. Критически важно фильтровать по роли customer, чтобы не удалить админов или редакторов.
  • Проблемы с правами. Убедитесь, что wp_delete_user вызывается в контексте с достаточными правами (например, из админки или WP-CLI).
  • Частые вызовы WP-Cron. WP-Cron зависит от посещений сайта. При низком трафике задачи могут запускаться нерегулярно. Для надёжности используйте системный cron и wp-cron.php.

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

  • Перед массовым удалением всегда делайте бэкап базы данных.
  • Рассмотрите возможность добавления логирования удалённых пользователей для аудита.
  • Чтобы снизить нагрузку, обрабатывайте пользователей порциями, например, по 50 за раз, если база большая.
  • Используйте WP-CLI для запуска таких задач вне пиковых нагрузок.
  • Если в магазине много клиентов, можно добавить подтверждение удаления через email или двуступенчатую очистку.

Сравнение подходов: плагин vs собственный код

КритерийПлагинСобственный кодКомпромисс
ГибкостьОграничена настройкамиПолный контрольВстроить API плагина в свой код
ОбновленияАвтоматическиеНужно поддерживатьИспользовать проверенные плагины с хуками
ПроизводительностьМожет нагружать сайтОптимизируем самостоятельноПисать код с пакетной обработкой
БезопасностьВозможны уязвимостиКонтроль над кодомАудит кода и тестирование
Как создать собственный шорткод WordPress с поддержкой параметров
06.11.2025
Автоматическое удаление заказов WooCommerce по статусу с помощью кода
07.05.2026
Автоматическое удаление неактивных клиентов в WooCommerce по сроку бездействия
26.04.2026
Как удалить или изменить slug записи WordPress без потери SEO
05.01.2026
Как избежать конфликтов плагинов в WordPress: практические советы и примеры кода
07.04.2026