Диагностика проблемы: что происходит при автоматическом возврате средств в WooCommerce
По умолчанию WooCommerce не меняет статус заказа автоматически при возврате денег через платежные шлюзы. Если возврат происходит вне панели WooCommerce (например, напрямую через банк или внешний сервис), статус заказа остаётся прежним, что создаёт путаницу в учёте и мешает автоматизации дальнейших действий.
Проверить проблему можно так:
- Откройте заказ в админке WooCommerce;
- Проверьте статус заказа после проведения возврата;
- Если статус не изменился на «Возврат» (refunded) или «Отменён», это подтверждает проблему.
Пошаговое решение: автоматическое изменение статуса заказа при возврате денег
Шаг 1. Использование хука woocommerce_order_refunded
WooCommerce генерирует событие woocommerce_order_refunded после успешного возврата средств. Можно использовать этот хук, чтобы программно изменить статус заказа.
Шаг 2. Добавление кода в functions.php темы или в собственный плагин
add_action('woocommerce_order_refunded', 'auto_change_order_status_on_refund', 10, 2);
function auto_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();
if ($total_refunded >= $order_total) {
// Изменяем статус заказа на refunded
$order->update_status('refunded', 'Автоматическое изменение статуса после полного возврата средств');
$order->save();
}
}Шаг 3. Тестирование кода в рабочем окружении
Создайте тестовый заказ, оплатите его через платежный шлюз, затем выполните возврат через админку WooCommerce или тестовый шлюз. Убедитесь, что после возврата статус заказа изменился на refunded.
Проверка результата после внедрения
- Создайте новый заказ на тестовом сайте;
- Оплатите заказ с помощью тестового платежного шлюза;
- Верните деньги через WooCommerce (создайте возврат);
- Проверьте, что статус заказа автоматически изменился на «Возврат» (refunded);
- Если статус не изменился — проверьте логи ошибок и наличие кода.
Частые ошибки и как их исправить
- Код не срабатывает: Проверьте, что функция подключена и ваш файл
functions.phpзагружается. Ошибки синтаксиса останавливают выполнение. - Частичный возврат не меняет статус: В коде проверяется, что сумма возврата равна или превышает сумму заказа. Если хотите менять статус и при частичном возврате — уберите или измените условие.
- Платёжный шлюз не вызывает событие возврата: Некоторые шлюзы проводят возврат вне WooCommerce, тогда код не сработает. В этом случае нужна интеграция с API шлюза или периодическая синхронизация.
Практические советы по безопасности и производительности
- Не изменяйте статус на основании внешних данных без проверки — это может привести к ошибкам в учёте.
- Используйте кэширование и минимизируйте запросы к базе, если добавляете дополнительные проверки.
- Всегда тестируйте изменения на staging-сайте перед внедрением на боевой проект.
Сравнение вариантов решения
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_order_refunded | Автоматическое изменение статуса после возврата через WooCommerce | Простота, надежность, минимальный код | Не срабатывает при возврате вне WooCommerce |
| Интеграция с API платежного шлюза | Отслеживание возвратов вне WooCommerce через API | Точность, полный контроль | Сложность реализации, требует поддержки API |
| Ручное изменение статуса | Администратор вручную меняет статус после возврата | Простота | Риск ошибок и пропусков, нет автоматизации |