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
09.04.2026
Как создать автоматические уведомления в WordPress с помощью хуков и плагинов
25.02.2026
WooCommerce: как отменить и изменить статус возврата товара
14.05.2026
Как удалить пустые мета-данные в WordPress: эффективные методы и примеры
15.03.2026
Как полностью удалить пользователя в WordPress вместе со всеми его данными
06.02.2026