Диагностика проблемы: почему не меняется статус заказа при возврате в WooCommerce
По умолчанию WooCommerce не меняет статус заказа автоматически при возврате товара. Возврат можно зафиксировать через админ-панель, но статус заказа остаётся прежним, что приводит к путанице в учёте и отчётности. Если вы используете сторонние плагины для возвратов, они не всегда корректно обновляют статус заказа, особенно если возврат оформляется вручную или через email-запросы.
Типичные симптомы проблемы:
- Статус заказа остаётся "Завершён" или "Обработка" после возврата.
- Отчёты по возвратам не учитывают корректно возвращённые товары.
- Невозможность автоматического уведомления клиентов о возврате из-за некорректного статуса заказа.
Пошаговое решение: автоматизация смены статуса заказа при возврате
1. Используем хук WooCommerce для отслеживания возвратов
WooCommerce хранит возвраты как объекты типа WC_Refund, привязанные к заказу. Для автоматического изменения статуса нужно реагировать на создание возврата и проверять его сумму.
2. Добавляем пользовательский код в functions.php вашей темы или плагина
add_action('woocommerce_refund_created', 'auto_change_order_status_on_refund', 10, 2);
function auto_change_order_status_on_refund($refund_id, $args) {
$refund = wc_get_order($refund_id); // WC_Refund объект
$parent_order_id = $refund->get_parent_id();
$parent_order = wc_get_order($parent_order_id);
if (!$parent_order) {
return;
}
$total_refunded = $parent_order->get_total_refunded();
$order_total = $parent_order->get_total();
// Если возврат покрывает всю сумму заказа или больше
if ($total_refunded >= $order_total) {
// Меняем статус на refunded (возвращён)
$parent_order->update_status('refunded', 'Автоматический статус изменён после полного возврата');
} else {
// Если возврат частичный, можно установить статус partially_refunded, если он есть
if (in_array('partially-refunded', wc_get_order_statuses())) {
$parent_order->update_status('partially-refunded', 'Частичный возврат, статус обновлён автоматически');
}
}
}3. Добавляем поддержку частичного возврата (опционально)
WooCommerce не имеет статуса partially-refunded по умолчанию. Его можно добавить так:
add_filter('wc_order_statuses', 'add_partially_refunded_status');
function add_partially_refunded_status($statuses) {
$new_statuses = array();
foreach ($statuses as $key => $label) {
$new_statuses[$key] = $label;
if ($key === 'wc-processing') {
$new_statuses['wc-partially-refunded'] = 'Частично возвращён';
}
}
return $new_statuses;
}
add_action('init', 'register_partially_refunded_status');
function register_partially_refunded_status() {
register_post_status('wc-partially-refunded', 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>'),
));
}Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce.
- Оформите возврат этого заказа в админке через "Возвраты".
- Проверьте, автоматически ли поменялся статус заказа на
refundedилиpartially-refundedв зависимости от суммы возврата. - Убедитесь, что комментарий к заказу содержит сообщение об автоматическом изменении статуса.
Частые ошибки и их исправление
- Не срабатывает хук
woocommerce_refund_created: убедитесь, что возврат оформлен корректно через WooCommerce, а не через сторонние плагины, которые не вызывают этот хук. - Статус не меняется на пользовательский (
partially-refunded): проверьте регистрацию статуса, возможно, код добавления статуса не подключён или выполняется слишком поздно. - Ошибка при вызове
update_status: убедитесь, что объект заказа получен корректно и не равенnull.
Практические советы по безопасности и производительности
- Добавляйте код в дочернюю тему или отдельный плагин, чтобы избежать потери при обновлении.
- Используйте
wc_get_orderдля получения объектов заказов и возвратов — это стандарт и безопасно. - Избегайте избыточных запросов к базе, используйте методы объекта заказа для получения данных.
- Проверяйте права пользователя, если расширяете функциональность в админке.
Сравнение вариантов автоматизации изменения статуса возврата
| Метод | Плюсы | Минусы | Примечание |
|---|---|---|---|
Код на хуке woocommerce_refund_created | Гибкость, не требует внешних плагинов, работает автоматически | Требует базовых навыков PHP, не покрывает сторонние плагины возвратов | Рекомендуется для разработчиков |
| Сторонние плагины возврата | Интерфейс и дополнительные функции возвратов | Могут не менять статус заказа автоматически, нагрузка на сайт | Удобно для непрофессионалов |
| Ручное изменение статуса заказа | Простота без кода | Риск человеческой ошибки, дополнительное время | Не подходит для больших магазинов |