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

Диагностика задачи: когда нужно отменить заказ после оплаты

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

Пошаговое решение: отменяем заказ после оплаты

1. Выбор правильного хука для отслеживания оплаты

Для реагирования на успешную оплату лучше всего использовать хук woocommerce_order_status_completed или woocommerce_payment_complete. Первый срабатывает, когда заказ переводится в статус "завершён", второй — сразу после успешной оплаты.

В зависимости от бизнес-логики, стоит выбрать подходящий.

2. Добавляем функцию отмены заказа

Ниже пример функции, которая отменяет заказ сразу после оплаты. В реальном сценарии здесь можно добавить условия (например, проверка наличия товара или определённый метод оплаты).

add_action('woocommerce_payment_complete', 'wp7_cancel_order_after_payment');
function wp7_cancel_order_after_payment($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Условие отмены — пример: отменяем все заказы, оплатившиеся через метод 'bacs'
    if ($order->get_payment_method() === 'bacs') {
        // Проверяем, что заказ не отменён уже
        if ($order->get_status() !== 'cancelled') {
            $order->update_status('cancelled', __('Заказ автоматически отменён после оплаты (метод BACS)', 'wp7'));
        }
    }
}

3. Подключение к functions.php или в виде мини-плагина

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

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

  1. Создайте тестовый заказ с оплатой выбранным методом (например, BACS).
  2. Завершите оплату (можно имитировать для теста).
  3. Перейдите в админку WooCommerce > Заказы и проверьте статус заказа.
  4. Он должен автоматически изменить статус на cancelled и в комментариях к заказу появится сообщение об отмене.

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

  • Код не срабатывает: Проверьте, правильно ли указан хук и вызывается ли функция. Добавьте error_log внутри функции для отладки.
  • Отмена происходит не для всех заказов: Проверьте условие в коде. Возможно, метод оплаты отличается или статус заказа уже "cancelled".
  • Изменение статуса вызывает бесконечный цикл: Не используйте хук, который срабатывает на смену статуса cancelled. В примере используется woocommerce_payment_complete — безопасно.

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

  • Не добавляйте в функцию тяжелые операции или внешние запросы — это может замедлить процесс оплаты.
  • Для отладки используйте журнал WooCommerce (WooCommerce > Статус > Логи) или системный error_log.
  • Обязательно проверяйте, что объект заказа валиден, чтобы избежать фатальных ошибок.
  • В продакшене ограничьте логику условиями, чтобы не отменять заказы без нужды.

Сравнение вариантов реализации отмены заказа после оплаты

ВариантОписаниеПлюсыМинусы
Хук woocommerce_payment_completeОтмена сразу после оплатыРаботает во всех платежных системах, сразу после оплатыНужно аккуратно проверять условия, чтобы не отменить лишнее
Хук woocommerce_order_status_completedОтмена при переходе в статус "завершён"Позволяет отменять заказы после полного завершенияНе срабатывает при оплате без автоматического перехода в "завершён"
Плагин автоматизацииИспользование готовых решений для автоотменыМинимум кода, удобный интерфейсМожет влиять на производительность, лишние зависимости
Как изменить имя пользователя в WordPress без плагинов
14.04.2026
Как установить ограничения на количество публикаций для пользователей в WordPress
02.03.2026
Как автоматизировать очистку базы данных WordPress
11.03.2026
Как создать динамические формы с помощью WPForms в WordPress
22.12.2025
WooCommerce: как отменить покупку после оплаты через код
29.05.2026