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

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

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

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

1. Использование хука woocommerce_payment_complete

Этот хук срабатывает сразу после успешного завершения платежа. В обработчике можно проверить статус заказа и изменить его на "отменён".

add_action('woocommerce_payment_complete', 'auto_cancel_order_after_payment', 10, 1);
function auto_cancel_order_after_payment($order_id) {
    if (!$order_id) return;

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

    // Проверяем, что заказ в статусе 'processing' или 'on-hold'
    if (in_array($order->get_status(), ['processing', 'on-hold'])) {
        // Меняем статус на 'cancelled'
        $order->update_status('cancelled', 'Заказ автоматически отменён после оплаты');
    }
}

2. Ограничение применения по условиям

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

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

    $cancel_order = false;
    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if (has_term('test-category', 'product_cat', $product->get_id())) {
            $cancel_order = true;
            break;
        }
    }

    if ($cancel_order && in_array($order->get_status(), ['processing', 'on-hold'])) {
        $order->update_status('cancelled', 'Автоматическая отмена заказа с продуктами из test-category');
    }
}

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

  • Создайте тестовый заказ с товарами из выбранной категории.
  • Оплатите заказ через тестовый платежный метод.
  • Перейдите в админку WooCommerce → Заказы и проверьте, что статус заказа автоматически изменился на "отменён".
  • Проверьте, что в истории изменений заказа появилась запись с комментарием из кода (например, "Заказ автоматически отменён после оплаты").

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

  • Заказ не меняет статус: Проверьте, что хук woocommerce_payment_complete срабатывает. Для теста добавьте error_log('Payment complete: '.$order_id); внутрь функции.
  • Отмена заказа происходит для всех заказов: Добавьте условия по категориям, меткам или другим параметрам товаров.
  • Проблемы с правами доступа или кешированием: Очистите кеш WooCommerce и браузера, убедитесь, что нет конфликтов с другими плагинами, временно отключите их.
  • Изменение статуса не отображается в клиентской части: Проверьте шаблоны темы, возможно, они кэшируют статус заказа.

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

  • Не используйте автоматическую отмену для реальных оплаченных заказов без серьёзных условий — это может привести к потере продаж и проблемам с клиентами.
  • Логируйте изменения статусов в отдельный файл или используйте системный журнал для последующего аудита.
  • Используйте wc_get_order() вместо прямого запроса к базе, чтобы избежать проблем с кешированием и совместимостью.
  • Если нужны расширенные условия, рассмотрите возможность создания отдельного плагина с этим кодом, чтобы проще управлять функционалом.

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

МетодПреимуществаНедостатки
Хук woocommerce_payment_complete с кастомным кодомПолный контроль, нет зависимостей от плагинов, гибкость условийТребует навыков программирования, возможны ошибки без тестирования
Плагины для управления статусами заказовУпрощённая настройка, готовый интерфейсМогут быть избыточны, замедлять сайт, зависеть от обновлений
Ручная отмена в админкеПростота, нет кодаНе автоматизировано, трудозатратно на больших объемах
Как изменить авторизацию в WordPress через AJAX без плагинов
15.12.2025
WooCommerce: как отменить заказ после оплаты через код
01.06.2026
Как работает автоматическое сохранение в WordPress на примере WP7
07.04.2026
Как создать многоязычный сайт на WordPress без плагинов
18.12.2025
Как изменить структуру URL сообщений в WordPress без плагинов
19.01.2026