WooCommerce: установка и настройка подтверждения возврата товара

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

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

Основные симптомы проблемы:

  • Отсутствие уведомления о новых запросах на возврат;
  • Невозможность централизованно управлять статусом возврата товаров;
  • Отсутствие подтверждения возврата для пользователя;
  • Ошибки при автоматическом возврате средств без проверки.

Пошаговое решение: создание системы подтверждения возврата

1. Добавление нового статуса заказа для возврата

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

add_action('init', function() {
    register_post_status('wc-return_requested', 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_filter('wc_order_statuses', function($order_statuses) {
    $order_statuses['wc-return_requested'] = 'Возврат запрошен';
    return $order_statuses;
});

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

Добавим на страницу «Мои заказы» кнопку для запроса возврата с пояснением причины. Для этого используем хук woocommerce_my_account_my_orders_actions.

add_filter('woocommerce_my_account_my_orders_actions', function($actions, $order) {
    if ($order->has_status('completed')) {
        $actions['request_return'] = array(
            'url' => wp_nonce_url(add_query_arg('request_return', $order->get_id()), 'request_return_' . $order->get_id()),
            'name' => 'Запросить возврат',
        );
    }
    return $actions;
}, 10, 2);

add_action('wp', function() {
    if (!empty($_GET['request_return']) && !empty($_GET['_wpnonce'])) {
        $order_id = intval($_GET['request_return']);
        if (!wp_verify_nonce($_GET['_wpnonce'], 'request_return_' . $order_id)) {
            wp_die('Ошибка безопасности');
        }
        $order = wc_get_order($order_id);
        if ($order && $order->get_user_id() === get_current_user_id()) {
            $order->update_status('return_requested', 'Клиент запросил возврат');
            wc_add_notice('Запрос на возврат отправлен. Ожидайте подтверждения.', 'success');
            wp_redirect(wc_get_account_endpoint_url('orders'));
            exit;
        }
    }
});

3. Уведомление менеджера о новом запросе

Добавим отправку уведомления администратору при смене статуса на return_requested.

add_action('woocommerce_order_status_return_requested', function($order_id) {
    $order = wc_get_order($order_id);
    $to = get_option('admin_email');
    $subject = 'Новый запрос на возврат #' . $order_id;
    $message = 'Пользователь ' . $order->get_billing_email() . ' запросил возврат по заказу #' . $order_id . ".\n\nПерейдите в админку для обработки запроса.";
    wp_mail($to, $subject, $message);
});

4. Обработка и подтверждение возврата в админке

Рекомендуется добавить в админке фильтр по статусу «Возврат запрошен» для удобства, а при подтверждении менять статус заказа на refunded или другой подходящий.

Можно использовать стандартный механизм возврата средств WooCommerce вручную или автоматизировать через API платежного шлюза.

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

  • Пользователь видит кнопку «Запросить возврат» в списке заказов со статусом «Завершен»;
  • При нажатии кнопки статус заказа меняется на «Возврат запрошен»;
  • Администратор получает письмо о новом запросе;
  • В админке появилась возможность фильтровать заказы со статусом «Возврат запрошен»;
  • После обработки возврата статус заказа меняется и пользователь уведомляется.

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

  • Ошибка безопасности nonce: Проверьте правильность создания и проверки nonce в URL. Без nonce запросы могут быть заблокированы.
  • Отсутствие кнопки для возврата: Убедитесь, что фильтр woocommerce_my_account_my_orders_actions добавлен правильно и статус заказа подходит.
  • Письма не отправляются: Проверьте настройки SMTP на сервере и функцию wp_mail. Для отладки используйте плагин WP Mail Logging.
  • Статус не отображается в админке: Проверьте регистрацию статуса через register_post_status и фильтр wc_order_statuses.

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

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

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

МетодПлюсыМинусы
Плагин возврата (например, WooCommerce RMA)Готовый функционал, поддержка, интеграцияСтоимость, лишний код, зависимость
Кастомный код (как в статье)Точный контроль, легковесность, адаптацияТребует разработчика, поддержка своими силами
Интеграция через сторонние сервисы (Helpdesk, CRM)Расширенный функционал, автоматизацияСложность интеграции, стоимость, задержки
WooCommerce: автоматическое удаление неактивных вариантов и атрибутов
23.06.2026
Как создать уникальный Metabox в WordPress с примером кода
23.12.2025
Как создать автоматический импорт постов в WordPress из внешнего источника
15.02.2026
Как добавить свой shortcode в WordPress
03.11.2025
WooCommerce: Автоматическое удаление товаров с оценками старше 30 дней
19.06.2026