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