Диагностика проблемы: зачем менять статус заказа автоматически при возврате
В стандартном WooCommerce возврат товара требует ручного изменения статуса заказа или установки дополнительных плагинов. Это приводит к задержкам обработки возврата и ошибкам в учёте. Если магазин часто обрабатывает возвраты, автоматизация этого процесса значительно экономит время и снижает человеческий фактор.
Пошаговое решение: как автоматически менять статус заказа при возврате товара
1. Определяем подходящий хук
Для отслеживания возврата мы используем статус заказа и функции WooCommerce для проверки возврата товаров. Хук woocommerce_order_refunded срабатывает, когда создаётся возврат.
2. Добавляем функцию для изменения статуса заказа
В файл functions.php вашей дочерней темы или в кастомный плагин добавьте следующий код:
add_action('woocommerce_order_refunded', 'custom_change_order_status_on_refund', 10, 2);
function custom_change_order_status_on_refund($order_id, $refund_id) {
$order = wc_get_order($order_id);
if (!$order) return;
// Проверяем, если возврат покрывает всю сумму заказа
$total_refunded = $order->get_total_refunded();
$order_total = $order->get_total();
// Если возврат равен или больше суммы заказа — меняем статус на "refunded"
if ($total_refunded >= $order_total) {
$order->update_status('refunded', 'Статус автоматически изменён после полного возврата');
} else {
// Частичный возврат — можно установить кастомный статус или логировать
// $order->update_status('partially-refunded'); // если есть такой статус
}
}3. Добавляем новый статус (опционально)
Если нужны промежуточные статусы, например, "partially-refunded", их нужно зарегистрировать:
add_action('init', 'register_custom_order_status');
function register_custom_order_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>')
));
}
add_filter('wc_order_statuses', 'add_custom_order_status_to_list');
function add_custom_order_status_to_list($order_statuses) {
$order_statuses['wc-partially-refunded'] = 'Частично возвращён';
return $order_statuses;
}Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce.
- Оформите возврат через админку.
- Если возврат полный, статус заказа должен измениться на
refunded. - Если возврат частичный и вы добавили кастомный статус, проверьте, что статус отражается корректно.
- Проверяйте логи ошибок в
wp-content/debug.logпри включённом WP_DEBUG для диагностики.
Частые ошибки и как их исправить
- Статус не меняется после возврата: Возможно, возврат не оформлен через функцию WooCommerce. Проверьте, что возврат создаётся именно через админку WooCommerce или API.
- Код не срабатывает: Убедитесь, что хук
woocommerce_order_refundedподключён правильно и нет конфликтов с другими плагинами. - Кастомный статус не отображается: Проверьте регистрацию статуса и фильтр
wc_order_statuses. Очистите кеш админки. - Проблемы с правами доступа: Убедитесь, что пользователь, оформляющий возврат, имеет соответствующие права.
Практические советы по безопасности и производительности
- Добавляйте код только в дочернюю тему или кастомный плагин, чтобы избежать потери при обновлении.
- Используйте
wp_cache_flush()с осторожностью, если кеширование мешает обновлению статуса. - Тестируйте на staging-сайте, прежде чем внедрять на живом магазине.
- Логируйте действия функции в файл через
error_log()для отладки.
Сравнение способов реализации автоматического изменения статуса
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
Код через woocommerce_order_refunded | Лёгкий, без плагинов, гибкий | Требует навыков PHP, поддержка на себе | Подходит для разработчиков |
| Плагин автоматизации возвратов | Прост в установке, поддержка | Может нагружать сайт, лицензия | Для непрофессионалов или сложных сценариев |
| Ручное изменение статусов | Простота, без кода | Человеческий фактор, ошибки | Малые магазины с редкими возвратами |