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

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

В интернет-магазинах на WooCommerce база клиентов со временем растёт, но не все пользователи остаются активными. Неактивные клиенты — это пользователи, которые не делали заказов или не заходили в личный кабинет длительное время (например, 1 год). Их хранение увеличивает размер базы данных, может замедлять запросы и усложнять аналитику. Автоматическое удаление таких пользователей помогает поддерживать базу в актуальном состоянии и улучшить производительность.

Критерии определения неактивных клиентов

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

  • Дата последнего заказа клиента — если заказов нет или последний заказ старше заданного срока.
  • Дата последнего входа в аккаунт — если пользователь не авторизовался в течение длительного времени.

В WooCommerce данные о заказах хранятся в таблице wp_posts с типом shop_order, связь с пользователем через мета-поле _customer_user. Дату последнего входа можно хранить самостоятельно с помощью хуков авторизации.

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

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

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

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

2. Функция для поиска неактивных клиентов

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

function get_inactive_customers($days = 365) {
    global $wpdb;
    $date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем всех клиентов
    $customers = get_users([
        'role' => 'customer',
        'fields' => ['ID'],
    ]);

    $inactive_ids = [];

    foreach ($customers as $user_id) {
        // Дата последнего входа
        $last_login = get_user_meta($user_id, 'last_login', true);
        if (!$last_login || $last_login < $date_limit) {
            // Получаем последний заказ пользователя
            $last_order_date = $wpdb->get_var($wpdb->prepare(
                "SELECT MAX(post_date) FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-processing') AND ID IN (SELECT post_id FROM {$wpdb->prefix}postmeta WHERE meta_key = '_customer_user' AND meta_value = %d)",
                $user_id
            ));

            if (!$last_order_date || $last_order_date < $date_limit) {
                $inactive_ids[] = $user_id;
            }
        }
    }

    return $inactive_ids;
}

3. Удаление неактивных клиентов

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

function delete_inactive_customers($days = 365) {
    $inactive_users = get_inactive_customers($days);
    foreach ($inactive_users as $user_id) {
        wp_delete_user($user_id);
    }
    return $inactive_users;
}

4. Запуск удаления по расписанию (WP Cron)

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

if (!wp_next_scheduled('weekly_inactive_customer_cleanup')) {
    wp_schedule_event(time(), 'weekly', 'weekly_inactive_customer_cleanup');
}

add_action('weekly_inactive_customer_cleanup', function() {
    $deleted = delete_inactive_customers(365);
    if (!empty($deleted)) {
        error_log('Removed inactive customers: ' . implode(', ', $deleted));
    }
});

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

  • Проверьте, что при логине пользователя в мета-поле last_login обновляется дата через get_user_meta($user_id, 'last_login', true).
  • Запустите вручную функцию delete_inactive_customers(365) через WP-CLI или временно вызовите в коде, чтобы проверить, возвращаются ли ID пользователей для удаления.
  • Проверьте логи (error_log), чтобы убедиться, что удаление произошло и зафиксировано.
  • В базе данных убедитесь, что удалённые пользователи отсутствуют в таблице wp_users.

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

  • Не обновляется дата последнего входа: проверьте, что хук wp_login зарегистрирован корректно и функция получает оба параметра ($user_login и $user).
  • Удаляются активные пользователи: проверьте правильность условий в функции get_inactive_customers, особенно даты и статусы заказов.
  • WP Cron не срабатывает: убедитесь, что на сайте есть трафик, запускающий WP Cron, или настройте системный cron для wp-cron.php.
  • Пользователи не удаляются: проверьте права пользователя, под которым запускается код, и работу функции wp_delete_user.

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

  • Перед удалением пользователей сделайте резервную копию базы данных.
  • Добавьте журналирование действий удаления для аудита через error_log или отдельную таблицу.
  • Не удаляйте пользователей сразу — можно сначала пометить их мета-полем, а затем удалять через несколько дней.
  • Оптимизируйте запросы к базе, особенно если клиентов много, разбивайте обработку по частям.

Таблица сравнения вариантов реализации удаления неактивных клиентов

МетодПлюсыМинусы
Использование плагина (например, WP User Manager)Простота настройки, графический интерфейс, поддержкаДополнительная нагрузка, возможные конфликты, платные функции
Код на основе WP Cron и функций WordPressГибкость, полное управление, отсутствие сторонних зависимостейТребует знаний PHP, нужно тестировать и поддерживать
Удаление вручную через SQL-запросыБыстрая массовая очисткаРиск повреждения данных, требует осторожности, отсутствует логика
WooCommerce: как автоматически удалять товары из заказов после их отмены
19.04.2026
WooCommerce: успешное отправление email после подтверждения заказа
31.05.2026
WooCommerce: как автоматически удалять отменённые заказы и товары из них
11.05.2026
WooCommerce: как автоматически удалять отменённые заказы с помощью кода
04.06.2026
Как создать динамическую форму в WordPress без плагинов
07.11.2025

Обучение разработке на WordPress, как создавать темы, плагины. Подробнее об обучении.