Диагностика проблемы с возвратами в 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) | Расширенный функционал, автоматизация | Сложность интеграции, стоимость, задержки |