WooCommerce: автоматическая отмена и возврат заказа через хук

Диагностика задачи: зачем нужна автоматизация возврата и отмены заказа

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

Пошаговое решение: как настроить автоматическую отмену и возврат заказа через хуки WooCommerce

1. Использование хука для смены статуса заказа

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

2. Пример автоматической отмены заказа через 24 часа после создания, если оплата не проведена

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

add_action('woocommerce_order_status_pending', 'schedule_order_cancellation', 10, 1);
function schedule_order_cancellation($order_id) {
    if (!$order_id) return;
    wp_schedule_single_event(time() + 86400, 'auto_cancel_order', array($order_id));
}

add_action('auto_cancel_order', 'auto_cancel_order_callback');
function auto_cancel_order_callback($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;
    // Проверяем, что статус заказа все еще 'pending'
    if ($order->get_status() === 'pending') {
        $order->update_status('cancelled', 'Автоматическая отмена заказа через 24 часа из-за отсутствия оплаты.');
    }
}

Здесь мы планируем событие отмены заказа через 24 часа (86400 секунд) после перехода заказа в статус pending. Если заказ не оплачен — он автоматически отменяется.

3. Автоматический возврат средств при смене статуса заказа на отменён

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

add_action('woocommerce_order_status_cancelled', 'auto_refund_order', 10, 1);
function auto_refund_order($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;
    
    // Проверяем, что заказ оплачен
    if (!$order->is_paid()) {
        return; // Возврат не нужен
    }

    // Проверяем, что возврат еще не создан
    if (count($order->get_refunds()) > 0) {
        return; // Возврат уже есть
    }

    // Создаем возврат на всю сумму
    $refund = wc_create_refund(array(
        'amount' => $order->get_total(),
        'reason' => 'Автоматический возврат при отмене заказа',
        'order_id' => $order_id,
        'refund_payment' => true,
    ));

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

Этот код автоматически инициирует полный возврат, как только заказ меняет статус на cancelled.

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

  • Создайте тестовый заказ со статусом pending.
  • Убедитесь, что через 24 часа статус заказа изменился на cancelled.
  • Создайте заказ, оплатите его, затем вручную смените статус на cancelled и проверьте, что возврат средств создан автоматически.
  • Проверьте логи ошибок в wp-content/debug.log при включенном WP_DEBUG, если возврат не сработал.

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

  • Событие wp_schedule_single_event не запускается: убедитесь, что на сайте есть трафик, так как WP-Cron зависит от посещений. Для теста можно вручную запускать cron через WP-CLI: wp cron event run --due-now.
  • Возврат не создаётся: проверьте, что платежный шлюз поддерживает автоматический возврат. Не все шлюзы позволяют программно делать возврат.
  • Дублирование возвратов: добавьте проверку, что возврат еще не был создан (как в примере выше).
  • Неверный статус заказа: используйте правильные статусы WooCommerce: pending, processing, completed, cancelled и т.п.

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

  • Всегда делайте резервное копирование сайта и базы данных перед внесением правок.
  • Используйте wp_schedule_single_event с умом, чтобы не создавать избыточное количество задач cron.
  • Добавляйте логи для отслеживания ошибок возврата, чтобы быстро диагностировать проблемы.
  • Убедитесь, что возвраты инициируются только при условии успешной оплаты, чтобы избежать финансовых ошибок.
  • Тестируйте работу на staging-сервере, а не на боевом.

Сравнение методов автоматизации возврата и отмены

МетодПлюсыМинусыКомпромисс
Хуки и WP-Cron (код)Полный контроль, нет зависимостей от плагиновТребует знаний PHP, возможны ошибки при неправильной реализацииЛучше для кастомных бизнес-логик
Плагины автоматизации возвратовПростота настройки, готовые сценарииМогут конфликтовать, увеличивают нагрузкуБыстрое решение для типовых задач
Ручная обработкаПолный контроль внутри админкиТрудозатратно, риск ошибитьсяИспользовать при редких возвратах
Как создать собственный вид аналитики в WordPress без сторонних сервисов
21.01.2026
Как использовать WooCommerce хуки для автоматизации обновления статуса заказа
27.06.2026
WooCommerce: как программно удалить вариации товаров и связанные SKU
12.05.2026
Как создать динамические виджеты в WordPress с использованием AJAX
21.11.2025
Как избежать проблем с кэшированием в WordPress
17.11.2025