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