Диагностика проблемы: когда и зачем менять статус возвратных заказов
В WooCommerce статус заказа "Возвращён" (refunded) часто используется для пометки заказов, по которым была проведена полная или частичная возвратная операция. По умолчанию этот статус не меняется автоматически и не влияет на дальнейшую обработку заказа или уведомления. Однако в ряде бизнес-сценариев нужно, чтобы такие заказы автоматически переводились в иной статус (например, "Завершён" или пользовательский статус), чтобы исключить их из дальнейших отчетов или запустить собственные процессы.
Проблема в том, что WooCommerce не предоставляет встроенного механизма для автоматического изменения статуса при возврате, а многие плагины добавляют громоздкие решения без гибкости.
Пошаговое решение: добавляем автоматическое изменение статуса
1. Используем хук woocommerce_order_refunded
Этот хук срабатывает сразу после проведения возврата по заказу. На его основе можно определить, что заказ был возвращён, и изменить статус.
add_action('woocommerce_order_refunded', 'wpdirect_auto_change_order_status_refunded', 10, 2);
function wpdirect_auto_change_order_status_refunded($order_id, $refund_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Проверяем, что текущий статус - refunded
if ($order->has_status('refunded')) {
// Меняем статус на 'completed' или любой другой
$order->update_status('completed', 'Автоматическое изменение статуса после возврата');
}
}
2. Кастомизация статуса
Если нужно использовать пользовательский статус, необходимо зарегистрировать его с помощью register_post_status и добавить в список доступных статусов WooCommerce.
// Регистрация кастомного статуса 'processed_refund'
add_action('init', 'wpdirect_register_custom_order_status');
function wpdirect_register_custom_order_status() {
register_post_status('wc-processed_refund', 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
add_filter('wc_order_statuses', 'wpdirect_add_custom_order_status');
function wpdirect_add_custom_order_status($order_statuses) {
$order_statuses['wc-processed_refund'] = 'Обработан возврат';
return $order_statuses;
}
// В функции изменения статуса заменить 'completed' на 'processed_refund'
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce и оплатите его.
- В админке сделайте возврат по заказу.
- После успешного возврата проверьте, изменился ли статус заказа на нужный (например, "Завершён" или "Обработан возврат").
- Убедитесь, что в логе статуса заказа появилась запись "Автоматическое изменение статуса после возврата".
Частые ошибки и как их исправить
- Хук не срабатывает: Проверьте, что возврат действительно проводится через админку WooCommerce и не сторонним плагином, который не вызывает
woocommerce_order_refunded. - Статус не меняется: Убедитесь, что используемый статус корректен и зарегистрирован (если кастомный). Проверьте, что функция
update_statusвызывается без ошибок. - Заказы не отображаются в нужных отчетах: Проверьте, включён ли новый статус в список статусов WooCommerce, особенно если используете кастомные.
Практические советы по безопасности и производительности
- Обрабатывайте только необходимые заказы, избегайте излишних вызовов функций в хуках.
- Используйте проверки наличия объекта
$orderи статуса перед изменением. - Логируйте события изменений для последующего аудита (можно использовать стандартный WP_Debug или собственный механизм).
Итоговый чек-лист для внедрения
- Добавили функцию на хук
woocommerce_order_refunded - Определили целевой статус для автоматической смены
- Зарегистрировали пользовательский статус (если нужен)
- Проверили корректность работы на тестовом заказе
- Проследили логи и статус заказа для подтверждения изменений