WooCommerce: как автоматически изменять статус заказа при автоматическом возврате денег

Диагностика проблемы: что происходит при автоматическом возврате средств в 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
Ручное изменение статусаАдминистратор вручную меняет статус после возвратаПростотаРиск ошибок и пропусков, нет автоматизации
Как использовать WPCommunity для создания профессионального форума на WordPress
30.12.2025
Как избежать проблем с производительностью WordPress при использовании внешних API
14.03.2026
Оптимизация WooCommerce за счёт загрузки изображений по требованию (lazy load)
18.04.2026
Как создать фильтры для курсов в WordPress
15.01.2026
WooCommerce: как автоматически отключить отгрузку заказа после оплаты
19.05.2026