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

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

В WooCommerce стандартно заказ после оплаты переводится в статус "Обработан" или "Завершен". Однако бывают ситуации, когда нужно отменить заказ уже после получения оплаты: например, товар отсутствует на складе, произошла ошибка в заказе или клиент запросил возврат до отправки.

Стандартного интерфейса для отмены оплаченного заказа нет, а просто сменить статус на «Отменён» вручную не всегда безопасно — это может привести к рассинхронизации с платежной системой или ошибкам в отчётах. Поэтому нужен программный подход, который корректно отменит заказ и отразит изменения во всех системах.

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

При переводе заказа в статус «Отменён» вручную WooCommerce не отменяет платеж, не возвращает деньги, не уведомляет клиента автоматически и не отменяет связанные задачи (например, отправку заказов или электронных товаров).

Кроме того, если платеж прошёл через сторонний шлюз, смена статуса не отменит транзакцию и не зафиксирует возврат.

Типичные симптомы неправильной отмены заказа

  • В отчётах WooCommerce статус заказа «Отменён», но деньги не возвращены;
  • Клиент не получает уведомления о возврате;
  • Заказ остаётся в очереди на отправку;
  • Платёжная система не синхронизирована с отменой заказа.

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

Для корректной отмены оплаченного заказа нужно:

  1. Проверить, что заказ оплачен и имеет подходящий статус;
  2. Выполнить возврат платежа через API платежного шлюза или WooCommerce;
  3. Изменить статус заказа на "Отменён";
  4. Отправить клиенту уведомление о возврате.

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

function wc_cancel_paid_order( $order_id ) {
    if ( ! $order_id ) return;

    $order = wc_get_order( $order_id );
    if ( ! $order ) return;

    // Проверяем, что заказ оплачен
    if ( ! $order->is_paid() ) {
        error_log('Заказ не оплачен, отмена не требуется');
        return;
    }

    // Возврат платежа через WooCommerce
    $refund = wc_create_refund( array(
        'amount'         => $order->get_total(),
        'reason'         => 'Отмена заказа после оплаты',
        'order_id'       => $order_id,
        'refund_payment' => true,
    ) );

    if ( is_wp_error( $refund ) ) {
        error_log('Ошибка возврата: ' . $refund->get_error_message());
        return;
    }

    // Меняем статус заказа на отменён
    $order->update_status( 'cancelled', 'Заказ отменён после оплаты с возвратом средств.' );

    // Отправляем уведомление клиенту
    WC()->mailer()->customer_refund( $order, $refund );
}

// Использование
// wc_cancel_paid_order( 123 ); // где 123 - ID заказа

Этот код создаёт полный возврат и переводит заказ в статус отменён. Обратите внимание, что:

  • Функция wc_create_refund работает только если платежный шлюз поддерживает возврат через WooCommerce API.
  • Если используется сторонний шлюз без интеграции возврата, нужно реализовать возврат через API этого шлюза отдельно.

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

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

  • Проверьте, что заказ в админке WooCommerce сменил статус на «Отменён»;
  • В разделе «Возвраты» заказа отображается созданный возврат;
  • Клиент получил email с уведомлением о возврате (проверьте почтовый ящик);
  • Если возможно, проверьте статус транзакции в личном кабинете платежного шлюза — возврат должен быть отмечен.

Частые ошибки при отмене оплаченных заказов в WooCommerce и как их исправить

  • Ошибка: возврат не создаётся, функция wc_create_refund возвращает ошибку.
    Причина: платежный шлюз не поддерживает возврат через WooCommerce.
    Решение: используйте API шлюза для возврата и только после успешного возврата меняйте статус заказа.
  • Ошибка: заказ меняет статус, но клиент не получает уведомление.
    Причина: уведомления отключены или не подключены к событию возврата.
    Решение: проверьте настройки email WooCommerce, убедитесь, что включено уведомление «Возврат клиенту».
  • Ошибка: после отмены заказа в отчётах остаётся сумма заказа.
    Причина: возврат не был создан, только статус изменён.
    Решение: всегда создавайте возврат через функцию wc_create_refund или API платежного шлюза.

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

  • Всегда проверяйте права пользователя перед выполнением отмены заказа через код (например, current_user_can('edit_shop_orders')).
  • Логируйте ошибки возврата, чтобы быстро реагировать на проблемы.
  • Не отменяйте заказы массово без ручной проверки, чтобы избежать ошибок с платежами.
  • Если возврат через API платежного шлюза занимает длительное время, используйте асинхронные задачи (например, WP-Cron или очередь).

Сравнение подходов отмены заказов в WooCommerce

МетодПлюсыМинусы
Ручная смена статуса на «Отменён»Простота, быстроНет возврата денег, рассинхронизация с платежами
Использование wc_create_refund для возврата и смены статусаПолный возврат, уведомления, синхронизацияТребуется поддержка шлюза, сложнее в реализации
Возврат через API платежного шлюза + смена статусаРаботает для любых шлюзов, полный контрольНужна интеграция с API, больше кода и тестов
Как использовать Custom Post Types для создания нестандартных типов записей
09.12.2025
Как отключить AJAX обновления в WooCommerce и решить проблемы с корзиной
20.04.2026
WooCommerce: как отменить заказ после оплаты с помощью кода
05.06.2026
Как использовать REST API в WordPress для создания приложений
20.11.2025
Как создать многоуровневую навигацию в WordPress без плагинов
01.01.2026