WooCommerce: автоматическая обработка возвратов с помощью хуков

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

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

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

1. Отслеживание статуса возврата

WooCommerce не имеет отдельного статуса "Возврат", поэтому обычно создают кастомный статус или используют мета-данные. В этом примере мы реализуем автоматическую смену статуса заказа на "refunded" при поступлении запроса на возврат и отправку уведомления клиенту.

2. Хук для обновления статуса заказа и возврата средств

Используем хук woocommerce_order_status_changed для реакции на смену статуса и функцию возврата средств refund_order.

add_action('woocommerce_order_status_changed', 'auto_process_refund', 10, 4);
function auto_process_refund($order_id, $old_status, $new_status, $order) {
    // Если статус меняется на 'requested-refund' (кастомный статус возврата)
    if ($new_status === 'requested-refund') {
        // Создаем возврат на всю сумму
        $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;
        }

        // Меняем статус на 'refunded'
        $order->update_status('refunded', 'Автоматический возврат завершён');

        // Отправляем уведомление клиенту
        wc_mail($order->get_billing_email(), 'Ваш возврат обработан', 'Ваш возврат заказа #' . $order_id . ' был успешно выполнен.');
    }
}

3. Регистрация кастомного статуса 'requested-refund'

Добавляем в функции темы или плагина:

function register_requested_refund_order_status() {
    register_post_status('wc-requested-refund', array(
        'label'                     => 'Запрошен возврат',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               => _n_noop('Запрошен возврат <span class="count">(%s)</span>', 'Запрошен возврат <span class="count">(%s)</span>')
    ));
}
add_action('init', 'register_requested_refund_order_status');

function add_requested_refund_to_order_statuses($order_statuses) {
    $new_order_statuses = array();

    // Вставляем после 'processing'
    foreach ($order_statuses as $key => $status) {
        $new_order_statuses[$key] = $status;
        if ('wc-processing' === $key) {
            $new_order_statuses['wc-requested-refund'] = 'Запрошен возврат';
        }
    }
    return $new_order_statuses;
}
add_filter('wc_order_statuses', 'add_requested_refund_to_order_statuses');

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

  • Перейдите в админку WooCommerce → Заказы и измените статус заказа на "Запрошен возврат".
  • Проверьте лог ошибок сервера (error_log) на предмет сообщений об ошибках возврата.
  • Убедитесь, что заказ получает статус "refunded" и что клиент получает email с уведомлением.
  • Проверьте, что средства возвращены через платежный шлюз (в тестовом режиме или через sandbox).

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

  • Ошибка: возврат не создается, возвращается WP_Error. Проверьте, поддерживает ли платежный шлюз автоматические возвраты и правильно ли передаются параметры в wc_create_refund.
  • Письмо клиенту не приходит. Убедитесь в корректности email клиента и настройках отправки почты на сервере.
  • Статус 'requested-refund' не отображается в админке. Проверьте регистрацию статуса и фильтр wc_order_statuses.
  • Автоматический возврат срабатывает на все статусы. Проверьте условие в функции, чтобы срабатывать только при смене на нужный статус.

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

  • Используйте nonce и проверку прав пользователя, если статус меняется через фронтенд.
  • Логируйте успешные и неудачные попытки возврата для аудита.
  • Оптимизируйте отправку email, чтобы не создавать нагрузку — используйте очереди или сторонние SMTP-сервисы.
  • Тестируйте на staging-сервере с реальными платежными шлюзами в sandbox-режиме.

Сравнение способов автоматизации возвратов

СпособПреимуществаНедостаткиПример
Хуки + кастомный статусГибкость, полный контроль, без сторонних плагиновТребует программирования и тестированияДанный пример с woocommerce_order_status_changed
Плагины для возвратов (например, WooCommerce RMA)Готовое решение, UI для клиентов и админовМожет быть дорогим, лишний код и нагрузкаWooCommerce RMA plugin
Ручная обработкаПростота, без кодаТрудозатратно, ошибки, нет автоматизацииАдминка WooCommerce
Автозаполнение метаданных для SEO в WordPress
12.12.2025
WooCommerce: как использовать хуки для добавления пользовательных функций
22.04.2026
Автоматическое создание резервных копий в WordPress: лучшие практические решения
19.11.2025
Автозаполнение категорий и тегов с помощью AI в WordPress
17.12.2025
Автоматическое добавление атрибутов и вариаций к товарам WooCommerce
25.04.2026