Проблема: как автоматизировать возврат денег при возврате товара в WooCommerce
В стандартном WooCommerce возврат товара обычно требует ручного создания возврата (refund) в админке. При большом количестве возвратов этот процесс занимает время и приводит к ошибкам. Задача — настроить автоматическую обработку возвратов и возврат средств при смене статуса заказа или при добавлении возврата через код.
Диагностика проблемы
Если вы пытаетесь программно вернуть деньги клиенту после возврата товара, но деньги не возвращаются автоматически, причиной может быть отсутствие правильного вызова WC_Order_Refund или некорректное обновление статуса заказа.
Проверить, создаются ли возвраты программно:
add_action('woocommerce_order_status_changed', function($order_id, $old_status, $new_status) {
error_log("Статус заказа #$order_id изменён с $old_status на $new_status");
}, 10, 3);Если в логе нет сообщений, значит хук не срабатывает или код не активен.
Пошаговое решение: автоматизация возвратов через хук
1. Подключаемся к изменению статуса заказа
add_action('woocommerce_order_status_changed', 'auto_refund_on_return', 10, 3);
function auto_refund_on_return($order_id, $old_status, $new_status) {
// Обрабатываем только переход в статус возврата
if ($new_status !== 'refunded') {
return;
}
$order = wc_get_order($order_id);
if (!$order) {
return;
}
// Проверяем, что возврат ещё не был сделан
if ($order->get_total_refunded() > 0) {
return; // Возврат уже проведён
}
// Создаём возврат
$refund = wc_create_refund(array(
'amount' => $order->get_total(),
'reason' => 'Автоматический возврат при смене статуса',
'order_id' => $order_id,
'refund_payment' => true,
));
if (is_wp_error($refund)) {
error_log('Ошибка создания возврата: ' . $refund->get_error_message());
} else {
error_log("Автоматический возврат создан для заказа #$order_id");
}
}2. Объяснение параметров
'amount'— сумма возврата (обычно равна полной стоимости заказа, но можно указать частичную);'reason'— причина возврата для истории;'order_id'— ID заказа;'refund_payment'— возвращать ли деньги на платёжный метод (true/false);
Проверка результата после внедрения
1. Создайте тестовый заказ в WooCommerce с оплатой любым способом.
2. В админке измените статус заказа на refunded.
3. Проверьте логи PHP (error_log), чтобы увидеть запись о создании возврата.
4. В админке WooCommerce убедитесь, что возврат отображается в заказе и сумма возвращена.
Частые ошибки и как исправить
- Возврат не создаётся: проверьте, что хук
woocommerce_order_status_changedиспользуется правильно и код подключен; - Возврат создаётся, но деньги не возвращаются: параметр
'refund_payment'должен бытьtrue, а платежный шлюз должен поддерживать автоматические возвраты; - Двойной возврат: добавлена проверка
$order->get_total_refunded() > 0для предотвращения повторных возвратов; - Ошибка доступа: убедитесь, что код выполняется в контексте WordPress и WooCommerce подключены.
Практические советы по безопасности и производительности
- Не делайте возврат денег полностью автоматически без проверки — это может привести к ошибкам и финансовым потерям. Лучше ограничить автоматизацию статусом или дополнительной проверкой;
- Логи ошибок помогут отследить проблемы — используйте
error_logили плагины для логирования; - Если возвраты частые и сложные, рассмотрите добавление интерфейса подтверждения в админке;
- Проверяйте совместимость с платежным шлюзом — не все поддерживают API возвратов.
Таблица сравнения способов возврата
| Способ | Плюсы | Минусы |
|---|---|---|
| Ручное создание возврата через админку | Простота, контроль | Затратно по времени, риск ошибок |
| Автоматизация через хук (как в статье) | Экономия времени, снижает ошибки | Нужно тестировать, зависит от платежного шлюза |
| Плагины для автоматизации возвратов | Готовые решения, иногда с расширенной логикой | Зависимость от сторонних разработчиков, нагрузка |