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

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

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

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

1. Создание нового статуса заказа «Возврат завершён» (опционально)

Для лучшей наглядности создадим отдельный статус:

function register_refunded_order_status() {
    register_post_status( 'wc-refunded-completed', 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_refunded_order_status' );

2. Добавление нового статуса в список WooCommerce

function add_refunded_order_status_to_wc( $order_statuses ) {
    $order_statuses['wc-refunded-completed'] = 'Возврат завершён';
    return $order_statuses;
}
add_filter( 'wc_order_statuses', 'add_refunded_order_status_to_wc' );

3. Автоматическое переключение статуса при возврате товара

Используем хук woocommerce_order_refunded, который вызывается при создании возврата:

function change_order_status_on_refund( $order_id, $refund_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) return;

    // Проверяем, что возврат покрывает всю сумму заказа (по желанию)
    $refund = wc_get_order( $refund_id );
    if ( $refund && $refund->get_amount() >= $order->get_total() ) {
        // Меняем статус на наш новый
        $order->update_status( 'refunded-completed', 'Автоматический статус после полного возврата', true );
    }
}
add_action( 'woocommerce_order_refunded', 'change_order_status_on_refund', 10, 2 );

4. Добавление статуса в административные фильтры

Чтобы статус был виден и фильтруем в админке:

function add_refunded_completed_to_admin_filters( $order_statuses ) {
    $order_statuses['refunded-completed'] = 'Возврат завершён';
    return $order_statuses;
}
add_filter( 'bulk_actions-edit-shop_order', 'add_refunded_completed_to_admin_filters' );

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

  • Создайте заказ и оплатите его.
  • Верните товар через WooCommerce (создайте возврат в админке).
  • Убедитесь, что после полного возврата статус изменился на «Возврат завершён».
  • Проверьте, что статус отображается в списке заказов и фильтрах.

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

  • Статус не меняется после возврата: проверьте, что возврат действительно оформлен через WooCommerce, а не вручную в базе данных.
  • Статус не отображается в админке: убедитесь, что добавили статус в фильтры и используете правильные ключи статусов (без префикса wc- для некоторых фильтров).
  • Автоматизация не срабатывает при частичном возврате: код выше меняет статус только при полном возврате. Для частичных возвратов нужно расширять логику.

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

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

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

МетодПлюсыМинусы
Использовать стандартный статус refundedПростота, нет дополнительного кодаМенее информативно, сложно выделить полностью завершённые возвраты
Создать кастомный статус и менять по событию возвратаЯсность статусов, удобство учёта, можно интегрировать с уведомлениямиНужно писать и поддерживать код, возможны ошибки при обновлениях WooCommerce
Плагин для управления статусамиГотовое решение с UI, поддержкаЗависимость от стороннего кода, нагрузка на сайт
WooCommerce: автоматическое удаление неактивных клиентов по времени
14.06.2026
Как использовать хуки для динамического отображения контента в WordPress
20.02.2026
Как автоматизировать удаление старого контента в WordPress по дате
24.02.2026
Как установить ограничение на регистрацию пользователей WordPress по IP и времени
13.04.2026
Уникальные методы защиты админ-панели WordPress от взлома
19.03.2026

Обучение разработке на WordPress, как создавать темы, плагины. Подробнее об обучении.