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

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

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

Проблема: как автоматизировать удаление пользователей, которые не делали заказов в течение определённого времени, например, 1 года?

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

1. Определение критериев неактивности

В нашем случае — это пользователи, у которых отсутствуют заказы за последние 365 дней.

2. Создание пользовательской функции для удаления

Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:

function wpg_delete_inactive_users_woocommerce() {
    $days_inactive = 365; // количество дней неактивности
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );
    
    // Получаем всех пользователей с ролью 'customer'
    $args = array(
        'role'    => 'customer',
        'fields'  => array('ID'),
        'number'  => -1
    );
    $users = get_users($args);

    foreach ($users as $user_id) {
        // Получаем последний заказ пользователя
        $orders = wc_get_orders(array(
            'customer_id' => $user_id,
            'limit'       => 1,
            'orderby'     => 'date',
            'order'       => 'DESC',
            'return'      => 'ids',
        ));

        if (empty($orders)) {
            // Если заказов нет, можно проверить дату регистрации
            $user = get_userdata($user_id);
            $user_registered = $user->user_registered;
            if ($user_registered < $date_threshold) {
                require_once(ABSPATH . 'wp-admin/includes/user.php');
                wp_delete_user($user_id);
            }
        } else {
            // Проверяем дату последнего заказа
            $last_order = wc_get_order($orders[0]);
            $order_date = $last_order->get_date_created()->date('Y-m-d H:i:s');
            if ($order_date < $date_threshold) {
                require_once(ABSPATH . 'wp-admin/includes/user.php');
                wp_delete_user($user_id);
            }
        }
    }
}

3. Запуск функции по расписанию с помощью WP-Cron

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

// Регистрируем событие при активации темы или плагина
if (!wp_next_scheduled('wpg_delete_inactive_users_daily')) {
    wp_schedule_event(time(), 'daily', 'wpg_delete_inactive_users_daily');
}

// Добавляем обработчик
add_action('wpg_delete_inactive_users_daily', 'wpg_delete_inactive_users_woocommerce');

4. Очистка планировщика при деактивации

function wpg_clear_delete_inactive_users_schedule() {
    $timestamp = wp_next_scheduled('wpg_delete_inactive_users_daily');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpg_delete_inactive_users_daily');
    }
}
register_deactivation_hook(__FILE__, 'wpg_clear_delete_inactive_users_schedule');

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

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

  • Временно измените $days_inactive на 1 или 2 дня и выполните функцию вручную через WP-CLI или прямо вызвав в админке;
  • Проверьте, что пользователи с заказами старше этого срока удаляются;
  • Убедитесь, что пользователи с недавними заказами сохраняются;
  • Проверьте логи ошибок и наличие удалённых пользователей в базе данных.

Пример вызова функции вручную (для теста):

add_action('admin_init', function() {
    if (current_user_can('administrator') && isset($_GET['run_delete_inactive'])) {
        wpg_delete_inactive_users_woocommerce();
        echo 'Удаление выполнено';
        exit;
    }
});

После теста удалите или закомментируйте этот код.

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

  • Удаляются не те пользователи: Проверьте правильность сравнения дат — дата регистрации и дата последнего заказа должны сравниваться с пороговой датой корректно.
  • Функция не запускается по расписанию: Убедитесь, что WP-Cron работает (например, бывает отключен на хостингах) — можно настроить системный cron для вызова wp-cron.php.
  • Пользователи с заказами удаляются: Возможно, заказы имеют статус, который не учитывается (например, черновики или отменённые). Можно добавить параметр 'status' => 'completed' в wc_get_orders для фильтрации.
  • Ошибка удаления пользователя из-за зависимостей: Проверьте, нет ли кастомных данных, которые мешают удалению. Можно сначала деактивировать плагины, управляя пользователями, чтобы исключить конфликты.

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

  • Всегда делайте резервные копии базы данных перед массовым удалением пользователей.
  • Для больших баз данных запускайте удаление порционно (например, по 100 пользователей за раз), чтобы избежать таймаутов.
  • Логируйте удалённые ID пользователей для возможного восстановления.
  • Используйте фильтры WooCommerce для выбора статусов заказов, чтобы не удалять пользователей с активными заказами.

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

МетодПлюсыМинусыРекомендуемый сценарий
Код на PHP с WP-Cron Полный контроль, не требует плагинов, автоматизация Требует навыков, возможны проблемы с WP-Cron Для опытных разработчиков, кастомные условия
Плагины очистки базы Простота использования, графический интерфейс Могут быть избыточными, меньше гибкости Для начинающих, быстрый запуск
Ручное удаление через админку Максимальная безопасность, точечное удаление Трудозатратно, не для больших баз Маленькие магазины, точечная очистка
WooCommerce: автоматическое создание и удаление купонов по расписанию
08.07.2026
WooCommerce: автоматическое удаление неактивных пользователей по дате последнего заказа
06.06.2026
Как добавить автоматическое сохранение черновиков в WordPress
30.12.2025
Автоматическое создание копий постов в WordPress с помощью кода
28.01.2026
Как отследить и удалить нерабочие ссылки в WooCommerce
20.04.2026