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

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

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

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

Под неактивным пользователем будем понимать того, кто не делал заказов в течение заданного периода (например, 1 год). Логика проверки:

  • Получить дату последнего заказа пользователя;
  • Сравнить с текущей датой;
  • Если прошло больше заданного интервала, пометить пользователя на удаление.

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

В WooCommerce заказы связаны с пользователями через user_id. Для получения последнего заказа можно использовать класс WC_Order_Query или запрос к базе.

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

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

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

function delete_inactive_woocommerce_customers() {
    $days_inactive = 365; // Период неактивности в днях
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );

    $args = array(
        'role'    => 'customer',
        'fields'  => 'ID',
        'number'  => -1,
    );
    $user_ids = get_users( $args );

    foreach ( $user_ids as $user_id ) {
        $last_order_date = get_last_order_date( $user_id );

        // Удаляем, если нет заказов или последний заказ старше порога
        if ( ! $last_order_date || $last_order_date < $date_threshold ) {
            wp_delete_user( $user_id );
        }
    }
}

// Регистрация ежедневного события WP-Cron
if ( ! wp_next_scheduled( 'daily_delete_inactive_customers' ) ) {
    wp_schedule_event( time(), 'daily', 'daily_delete_inactive_customers' );
}
add_action( 'daily_delete_inactive_customers', 'delete_inactive_woocommerce_customers' );

Как проверить, сработало ли удаление

1. Перед запуском сделайте резервную копию базы данных.

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

function delete_inactive_woocommerce_customers() {
    $days_inactive = 365;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );
    $args = array('role'=>'customer','fields'=>'ID','number'=>-1);
    $user_ids = get_users($args);
    foreach ($user_ids as $user_id) {
        $last_order_date = get_last_order_date($user_id);
        if (!$last_order_date || $last_order_date < $date_threshold) {
            if ( wp_delete_user($user_id) ) {
                error_log("Deleted inactive user ID: {$user_id}");
            }
        }
    }
}

3. Проверьте системный лог ошибок (например, debug.log) или свой лог-файл.

4. Также можно вручную проверить наличие пользователей с ролями customer в админке и убедиться, что неактивные исчезли.

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

  • Ошибка: Не удаляются пользователи с отсутствием заказов.
    Причина: Функция get_last_order_date возвращает false, но условие удаления не срабатывает.
    Решение: Проверьте условие if ( ! $last_order_date || $last_order_date < $date_threshold ), возможно, логика нарушена.
  • Ошибка: Удаление пользователей с активными заказами.
    Причина: Неверный формат даты или сравнение.
    Решение: Используйте объект DateTime для сравнения дат, чтобы избежать ошибок с форматом.
  • Ошибка: Событие WP-Cron не запускается.
    Причина: WP-Cron запускается только при посещении сайта.
    Решение: Настройте системный cron на сервере или вручную вызывайте событие.

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

  • Перед массовым удалением всегда делайте полное резервное копирование базы данных.
  • Добавьте проверку nonce или защиту запуска удаления только для администраторов при ручном запуске.
  • Для больших магазинов с тысячами пользователей используйте постраничный выбор и удаление, чтобы не перегружать сервер.
  • Регулярно очищайте WP-Cron задачи от устаревших событий, чтобы избежать конфликтов.
  • Для логирования используйте отдельный файл, а не системный лог, чтобы не засорять его.

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

МетодПлюсыМинусы
Код на PHP + WP-CronГибкость, автоматизация, без сторонних плагиновТребует навыков программирования, возможны ошибки без тестирования
Плагины для очистки пользователейПростота использования, готовые решенияМожет быть избыточным, нагрузка, возможные ограничения функционала
Ручное удаление через админкуПростота, контрольНеэффективно при большом объёме, риск человеческой ошибки
Как отследить и удалить нерабочие ссылки в WooCommerce
20.04.2026
Создание и настройка пользовательских ролей и прав в WordPress: практическое руководство
21.01.2026
Как автоматически создавать отзывы с экспертной оценкой в WordPress
22.02.2026
Как автоматически удалять неиспользуемые категории в WordPress
31.01.2026
WooCommerce: автоматическое удаление неактивных заказов по дате
20.06.2026