WooCommerce: как настроить отложенный возврат и отмену заказа через хуки

Как диагностировать проблему с возвратом и отменой заказа в WooCommerce

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

Диагностировать проблему можно так:

  • Проверить, есть ли у вас плагин для возвратов и отмен, и поддерживает ли он отложенную обработку.
  • Оценить, как сейчас реализована логика возврата — вручную через админку или автоматически.
  • Посмотреть, есть ли у вас задачи на cron, которые запускают обработку возвратов.
  • Проверить статус заказа и статусы возврата в админке.

Если возвраты обрабатываются вручную, и вы хотите автоматизировать их с задержкой, то потребуется написать кастомный код с использованием хуков WooCommerce и WP-Cron.

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

1. Создаем кастомную функцию для запуска возврата с задержкой

В этом примере мы используем WP-Cron для отложенного запуска функции возврата через 24 часа после запроса отмены.

function schedule_delayed_order_refund( $order_id ) {
    if ( ! wp_next_scheduled( 'process_delayed_refund', array( $order_id ) ) ) {
        wp_schedule_single_event( time() + DAY_IN_SECONDS, 'process_delayed_refund', array( $order_id ) );
    }
}

add_action( 'woocommerce_order_cancelled', 'schedule_delayed_order_refund' );

Здесь мы привязываемся к хуку woocommerce_order_cancelled, который срабатывает при отмене заказа, и планируем событие process_delayed_refund через 24 часа.

2. Обрабатываем отложенный возврат

Теперь нужно написать обработчик для нашего кастомного события.

add_action( 'process_delayed_refund', 'process_order_refund' );

function process_order_refund( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) {
        return;
    }

    // Проверяем, что заказ еще отменен и не возвращен
    if ( $order->has_status( 'cancelled' ) && ! $order->get_meta( '_refund_processed' ) ) {
        $refund_amount = $order->get_total();

        // Создаем возврат
        $refund = wc_create_refund( array(
            'amount'     => $refund_amount,
            'reason'     => 'Отложенный возврат после отмены',
            'order_id'   => $order_id,
            'refund_payment' => true,
        ) );

        if ( is_wp_error( $refund ) ) {
            error_log( 'Ошибка возврата заказа ' . $order_id . ': ' . $refund->get_error_message() );
        } else {
            $order->update_meta_data( '_refund_processed', 'yes' );
            $order->save();
        }
    }
}

Как проверить, что отложенный возврат работает

  • Создайте тестовый заказ в WooCommerce и отмените его через админку.
  • Проверьте, что в таблице cron (плагин WP Crontrol поможет) появилось событие process_delayed_refund с отложенным запуском.
  • Подождите 24 часа или вручную запустите cron-событие через WP Crontrol.
  • Проверьте статус возврата в заказе — должен появиться возврат суммы.
  • В логе ошибок (wp-content/debug.log) не должно быть ошибок, связанных с возвратом.

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

  • Возврат не создается, ошибка в логе WP: Проверьте, подключена ли платежная система, поддерживающая возвраты через API. Без этого wc_create_refund может возвращать ошибку.
  • Событие WP-Cron не запускается: Убедитесь, что на сервере включен WP-Cron или настроен системный cron для запуска wp-cron.php. Без этого отложенные задачи не выполнятся.
  • Возврат создается несколько раз: Добавьте проверку метаполя _refund_processed, как в примере, чтобы избежать повторного возврата одного заказа.

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

  • Не используйте слишком частые cron-задачи для возвратов — это нагрузит сервер и может привести к сбоям.
  • Всегда проверяйте, что заказ существует и имеет нужный статус перед выполнением возврата.
  • Регистрируйте ошибки в отдельный лог, чтобы быстро находить и исправлять проблемы.
  • Если платежная система не поддерживает автоматические возвраты, уведомляйте администратора о необходимости ручного подтверждения.

Сравнение вариантов реализации отложенного возврата

МетодОписаниеПреимуществаНедостатки
WP-Cron + wc_create_refundОтложенный возврат с использованием событий WP-Cron и стандартной функции WooCommerceПолная автоматизация, не требует сторонних плагиновЗависит от корректной работы WP-Cron и платежной системы
Плагин возвратов с отложенной обработкойИспользование специализированного плагина для возвратов с настройками задержкиПростота настройки, готовый UIЧасто платные, дополнительная нагрузка на сайт
Ручная отмена и возвратАдминистратор вручную отменяет и возвращает деньгиПолный контроль над процессомТрудозатратно, высокая вероятность ошибок
Автоматическое удаление старых записей в WordPress по дате
28.03.2026
Как автоматизировать управление контентом в WordPress с помощью WPKPI
29.12.2025
Как удалить текст из запроса поисковика в WordPress
10.11.2025
WooCommerce: автоматическое отключение отправки писем по заказам без оплаты
30.05.2026
WooCommerce: автоматическое удаление заказов после 30 дней без оплаты
21.05.2026