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

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

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

Диагностика задачи и анализ требований

Прежде чем приступать к коду, уточним ключевые моменты:

  • Удалять нужно пользователя, связанного с отменённым заказом.
  • Удаление должно происходить только при смене статуса заказа на "отменён" (cancelled).
  • Необходимо учитывать, что пользователь может иметь несколько заказов — удалять только если отменён последний заказ или если других заказов нет.
  • Удаление должно быть безопасным и не влиять на работу сайта.

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

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

Пример кода для файла functions.php вашей темы или в собственном плагине:

add_action('woocommerce_order_status_cancelled', 'delete_user_on_order_cancelled', 10, 1);
function delete_user_on_order_cancelled($order_id) {
    if (!$order_id) return;
    
    $order = wc_get_order($order_id);
    if (!$order) return;

    $user_id = $order->get_user_id();
    if (!$user_id) return; // Гость, пользователь не зарегистрирован

    // Проверяем есть ли у пользователя другие активные/завершённые заказы
    $args = [
        'customer_id' => $user_id,
        'status' => ['wc-processing', 'wc-completed', 'wc-on-hold'],
        'exclude' => [$order_id],
        'limit' => 1,
    ];

    $orders = wc_get_orders($args);

    if (empty($orders)) {
        // Удаляем пользователя, так как других заказов нет
        require_once ABSPATH . 'wp-admin/includes/user.php';
        wp_delete_user($user_id);
    }
}

Объяснение кода

  • Хук срабатывает при смене статуса заказа на "отменён".
  • Получаем ID пользователя, связанного с заказом.
  • Проверяем, есть ли у пользователя другие заказы в статусах обработки, завершён или ожидания.
  • Если других заказов нет, вызываем wp_delete_user() для удаления.

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

  1. Создайте тестовый заказ с новым пользователем.
  2. Перейдите в админке WooCommerce к заказу и смените статус на "Отменён".
  3. Проверьте в разделе "Пользователи", что аккаунт пользователя удалён.
  4. Если пользователь имеет другие заказы, аккаунт должен остаться.

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

  • Пользователь не удаляется: Проверьте, что у заказа есть связанный user_id. Заказы гостей не имеют пользователей.
  • Удаляется пользователь с активными заказами: Проверьте правильность фильтра по статусам и исключения текущего заказа.
  • Ошибка при удалении пользователя: Убедитесь, что подключена функция wp_delete_user() через require_once из wp-admin/includes/user.php.
  • Удаление пользователя ломает сайт: Настройте резервное копирование перед внедрением и тестируйте на копии сайта.

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

  • Удаление пользователя — необратимая операция. Обязательно делайте бэкап базы перед активацией кода.
  • Если на сайте много пользователей и заказов, фильтр по заказам wc_get_orders может создавать нагрузку. Ограничьте количество запросов, используя limit и проверяйте индексы в базе.
  • Рассмотрите вариант помечать пользователя как "неактивного" вместо удаления, чтобы избежать потери данных.
  • Используйте транзакции или логи для отслеживания удалений пользователей.

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

МетодПлюсыМинусыПример кода
Хук woocommerce_order_status_cancelled Автоматизация; работает сразу при отмене заказа Риск удаления нужных пользователей; нагрузка на БД при проверках Пример в статье выше
Отдельный cron-задача для удаления Контроль времени удаления; меньшая нагрузка в пиковые часы Задержка удаления; сложнее в реализации Планировщик WordPress с пользовательской функцией удаления
Ручное удаление админом Максимальный контроль; минимальный риск ошибок Требует ручной работы; неудобно на больших сайтах Нет кода, стандартная админка WP
WooCommerce: автоматическое удаление пользователя при отмене подписки
20.05.2026
WooCommerce: ограничение доступа к страницам по ролям пользователей
26.04.2026
WordPress авторизация через REST API: практическое руководство с примерами кода
25.12.2025
WordPress авторизация через временные токены: настройка и примеры кода
23.02.2026
WordPress кастомные сообщения об ошибках при входе: настройка и примеры
01.12.2025