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

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

По умолчанию WooCommerce не меняет статус заказа автоматически при возврате товара. Возврат можно зафиксировать через админ-панель, но статус заказа остаётся прежним, что приводит к путанице в учёте и отчётности. Если вы используете сторонние плагины для возвратов, они не всегда корректно обновляют статус заказа, особенно если возврат оформляется вручную или через email-запросы.

Типичные симптомы проблемы:

  • Статус заказа остаётся "Завершён" или "Обработка" после возврата.
  • Отчёты по возвратам не учитывают корректно возвращённые товары.
  • Невозможность автоматического уведомления клиентов о возврате из-за некорректного статуса заказа.

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

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

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

2. Добавляем пользовательский код в functions.php вашей темы или плагина

add_action('woocommerce_refund_created', 'auto_change_order_status_on_refund', 10, 2);
function auto_change_order_status_on_refund($refund_id, $args) {
    $refund = wc_get_order($refund_id); // WC_Refund объект
    $parent_order_id = $refund->get_parent_id();
    $parent_order = wc_get_order($parent_order_id);

    if (!$parent_order) {
        return;
    }

    $total_refunded = $parent_order->get_total_refunded();
    $order_total = $parent_order->get_total();

    // Если возврат покрывает всю сумму заказа или больше
    if ($total_refunded >= $order_total) {
        // Меняем статус на refunded (возвращён)
        $parent_order->update_status('refunded', 'Автоматический статус изменён после полного возврата');
    } else {
        // Если возврат частичный, можно установить статус partially_refunded, если он есть
        if (in_array('partially-refunded', wc_get_order_statuses())) {
            $parent_order->update_status('partially-refunded', 'Частичный возврат, статус обновлён автоматически');
        }
    }
}

3. Добавляем поддержку частичного возврата (опционально)

WooCommerce не имеет статуса partially-refunded по умолчанию. Его можно добавить так:

add_filter('wc_order_statuses', 'add_partially_refunded_status');
function add_partially_refunded_status($statuses) {
    $new_statuses = array();
    foreach ($statuses as $key => $label) {
        $new_statuses[$key] = $label;
        if ($key === 'wc-processing') {
            $new_statuses['wc-partially-refunded'] = 'Частично возвращён';
        }
    }
    return $new_statuses;
}

add_action('init', 'register_partially_refunded_status');
function register_partially_refunded_status() {
    register_post_status('wc-partially-refunded', 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>'),
    ));
}

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

  • Создайте тестовый заказ в WooCommerce.
  • Оформите возврат этого заказа в админке через "Возвраты".
  • Проверьте, автоматически ли поменялся статус заказа на refunded или partially-refunded в зависимости от суммы возврата.
  • Убедитесь, что комментарий к заказу содержит сообщение об автоматическом изменении статуса.

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

  • Не срабатывает хук woocommerce_refund_created: убедитесь, что возврат оформлен корректно через WooCommerce, а не через сторонние плагины, которые не вызывают этот хук.
  • Статус не меняется на пользовательский (partially-refunded): проверьте регистрацию статуса, возможно, код добавления статуса не подключён или выполняется слишком поздно.
  • Ошибка при вызове update_status: убедитесь, что объект заказа получен корректно и не равен null.

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

  • Добавляйте код в дочернюю тему или отдельный плагин, чтобы избежать потери при обновлении.
  • Используйте wc_get_order для получения объектов заказов и возвратов — это стандарт и безопасно.
  • Избегайте избыточных запросов к базе, используйте методы объекта заказа для получения данных.
  • Проверяйте права пользователя, если расширяете функциональность в админке.

Сравнение вариантов автоматизации изменения статуса возврата

МетодПлюсыМинусыПримечание
Код на хуке woocommerce_refund_createdГибкость, не требует внешних плагинов, работает автоматическиТребует базовых навыков PHP, не покрывает сторонние плагины возвратовРекомендуется для разработчиков
Сторонние плагины возвратаИнтерфейс и дополнительные функции возвратовМогут не менять статус заказа автоматически, нагрузка на сайтУдобно для непрофессионалов
Ручное изменение статуса заказаПростота без кодаРиск человеческой ошибки, дополнительное времяНе подходит для больших магазинов
Как добавить собственные поля в WordPress: пошаговое руководство
14.11.2025
Как использовать REST API для управления пользователями в WordPress
07.01.2026
WooCommerce: автоматическое изменение цен товаров при применении скидок к категориям
09.07.2026
Как удалить пустые мета-данные в WordPress: эффективные методы и примеры
15.03.2026
Как установить и настроить WPGPT для автоматизации контента в WordPress
12.02.2026