WooCommerce: как разрешить возврат товара с редактированием статуса заказа

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

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

Проблема проявляется в том, что покупатель не может самостоятельно оформить возврат через личный кабинет, либо возврат оформляется, но статус заказа не меняется, что затрудняет обработку и учет возвратов в админке.

Как добавить возможность возврата с редактированием статуса заказа: пошаговое решение

1. Создание пользовательского статуса заказа для возврата

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

add_filter('wc_order_statuses', function($order_statuses) {
    $order_statuses['wc-return_requested'] = _x('Return Requested', 'Order status', 'woocommerce');
    return $order_statuses;
});

add_action('init', function() {
    register_post_status('wc-return_requested', [
        'label' => _x('Return Requested', 'Order status', 'woocommerce'),
        'public' => true,
        'exclude_from_search' => false,
        'show_in_admin_all_list' => true,
        'show_in_admin_status_list' => true,
        'label_count' => _n_noop('Return Requested <span class="count">(%s)</span>', 'Return Requested <span class="count">(%s)</span>', 'woocommerce'),
    ]);
});

2. Добавление кнопки возврата в личный кабинет покупателя

Добавим кнопку Запросить возврат на странице заказов пользователя, которая переводит заказ в статус return_requested:

add_action('woocommerce_order_details_after_order_table', function($order) {
    if($order->has_status(['completed', 'processing']) && current_user_can('edit_shop_orders')) {
        echo '<form method="post" style="margin-top:1em;">';
        echo '<input type="hidden" name="return_order_id" value="'.esc_attr($order->get_id()).'" />';
        echo '<button type="submit" name="request_return" class="button">Запросить возврат</button>';
        echo '</form>';
    }
});

add_action('init', function() {
    if(!empty($_POST['request_return']) && !empty($_POST['return_order_id'])) {
        $order_id = intval($_POST['return_order_id']);
        $order = wc_get_order($order_id);
        if($order && $order->has_status(['completed', 'processing'])) {
            $order->update_status('return_requested', 'Пользователь запросил возврат');
            wc_add_notice('Запрос на возврат отправлен.', 'success');
            wp_redirect(wc_get_account_endpoint_url('orders'));
            exit;
        }
    }
});

3. Редактирование и обработка возвратов в админке WooCommerce

В админке менеджер сможет фильтровать заказы со статусом return_requested и менять статус вручную на refunded или cancelled в зависимости от результата возврата.

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

  • В личном кабинете пользователя появляется кнопка «Запросить возврат» для завершённых или обрабатываемых заказов.
  • При нажатии заказ переводится в статус «Return Requested» и отображается в админке с таким статусом.
  • Менеджер в админке может изменить статус заказа на «Возвращён» или другой.
  • В базе данных в таблице wp_posts у заказа обновляется поле post_status на wc-return_requested.

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

  • Кнопка возврата не отображается у пользователя: проверьте, что статус заказа соответствует условиям (completed, processing), и пользователь действительно владеет заказом.
  • Статус не меняется после отправки формы: убедитесь, что действие init срабатывает, и нет ошибок в логах PHP. Проверьте nonce и права доступа.
  • Новый статус не отображается в фильтрах админки: перепроверьте регистрацию статуса через register_post_status и фильтр wc_order_statuses.

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

  • Добавьте nonce-поля для защиты форм от CSRF-атак.
  • Ограничьте возможность запроса возврата только для авторизованных пользователей, владеющих заказом.
  • Используйте AJAX для отправки запроса возврата без перезагрузки страницы, чтобы улучшить UX.
  • Кэшируйте список статусов заказов в админке, если магазин большой, чтобы снизить нагрузку.

Сравнение вариантов реализации возвратов с редактированием статуса

МетодПлюсыМинусыПример использования
Код на functions.phpПолный контроль, без плагиновТребует навыков, нужно тестироватьПредставленный выше код
Плагин возвратов (например, WooCommerce Returns and Warranty)Готовый функционал, поддержкаПлатно, может быть избыточноДля магазинов с комплексной политикой
Использование сторонних CRM-интеграцийАвтоматизация, масштабируемостьСложность настройки, дополнительные расходыДля крупных магазинов с логистикой
Как удалить пустые категории в WordPress без ошибок
10.03.2026
Как добавить уникальный файловый заголовок (Content-Disposition) в WordPress
02.04.2026
Как настроить автоматический импорт данных из внешнего источника в WordPress
05.02.2026
WooCommerce: автоматическое изменение статуса заказа при возврате товара
11.05.2026
WooCommerce: как автоматически удалять неоплаченные заказы через заданный промежуток времени
30.05.2026