WooCommerce: автоматический возврат денег по неподтверждённым заказам

Диагностика проблемы с неподтверждёнными заказами и возвратом платежей в WooCommerce

В интернет-магазинах на WooCommerce часто возникают ситуации, когда заказы остаются в статусе «ожидает подтверждения» или «на рассмотрении» длительное время. Это может создать путаницу у покупателей и владельцев магазина, а также привести к заморозке денежных средств на счетах.

Типичные признаки проблемы:

  • Заказ не переводится в статус «завершён» или «обработан» автоматически;
  • Оплата была произведена, но заказ не подтверждён и не завершён;
  • Покупатель не получает уведомления о возврате;
  • Ручное управление возвратами занимает много времени и увеличивает риск ошибок.

Для проверки статусов заказов можно использовать SQL-запрос к базе данных или стандартный экран заказов в админке WooCommerce.

Пошаговое решение: настройка автоматического возврата по неподтверждённым заказам

1. Определяем критерии неподтверждённых заказов

Например, заказы, которые находятся в статусе on-hold или pending более 24 часов без изменений.

2. Реализация автоматического возврата через WP-Cron и WooCommerce API

Добавим в файл functions.php вашей темы следующий код, который будет запускать проверку заказов и инициировать возврат:

if ( ! wp_next_scheduled( 'auto_refund_unconfirmed_orders' ) ) {
    wp_schedule_event( time(), 'hourly', 'auto_refund_unconfirmed_orders' );
}

add_action( 'auto_refund_unconfirmed_orders', 'auto_refund_unconfirmed_orders_callback' );

function auto_refund_unconfirmed_orders_callback() {
    $args = [
        'limit' => -1,
        'status' => [ 'pending', 'on-hold' ],
        'date_created' => '<' . ( time() - 86400 ), // старше 24 часов
    ];

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        if ( ! $order->has_status( 'completed' ) && ! $order->has_status( 'cancelled' ) ) {
            // Проверяем, был ли уже возврат
            $refunds = $order->get_refunds();
            if ( empty( $refunds ) ) {
                try {
                    $amount = $order->get_total();
                    $refund = wc_create_refund( array(
                        'amount'     => $amount,
                        'reason'     => 'Автоматический возврат за неподтверждённый заказ',
                        'order_id'   => $order->get_id(),
                        'refund_payment' => true,
                    ) );
                    // Меняем статус заказа на отменён
                    $order->update_status( 'cancelled', 'Автоматический возврат выполнен.' );
                } catch ( Exception $e ) {
                    error_log( 'Ошибка возврата заказа ID ' . $order->get_id() . ': ' . $e->getMessage() );
                }
            }
        }
    }
}

3. Настройка уведомлений покупателю

Чтобы покупатель получил уведомление о возврате, можно использовать стандартные email-шаблоны WooCommerce с кастомизацией:

add_action( 'woocommerce_order_status_cancelled', function( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( $order ) {
        WC()->mailer()->emails['WC_Email_Cancelled_Order']->trigger( $order_id );
    }
} );

Проверка результата после внедрения решения

  • В разделе WooCommerce → Заказы убедитесь, что неподтверждённые заказы старше 24 часов автоматически меняют статус на cancelled.
  • Проверьте наличие записей о возвратах в заказах и историю транзакций платежной системы (например, PayPal или Stripe).
  • Проверьте, пришли ли уведомления покупателям о возврате средств.
  • В логе ошибок WordPress не должно быть сообщений об ошибках возврата.

Частые ошибки и как их исправить

  • Проблема с запуском WP-Cron: Если сайт получает мало трафика, WP-Cron может не запускаться вовремя. Решение — настроить системный cron на сервере для вызова WP-Cron.
    Команда для системного cron (пример): wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  • Отсутствие возврата в платежной системе: Убедитесь, что используемый платежный шлюз поддерживает автоматические возвраты через API WooCommerce и что ключи API корректны.
  • Права доступа и безопасность: Проверьте, что ваш код не вызывает возврат средств по ошибке для не тех заказов. Добавьте логи и проверки.
  • Не приходят уведомления: Проверьте настройки email WooCommerce, SMTP-сервер и шаблоны писем.

Практические советы по безопасности и производительности

  • Ограничьте период проверки заказов (например, только за последние 7 дней), чтобы не перегружать базу.
  • Добавьте логирование успешных и неуспешных возвратов для аудита.
  • Используйте транзакции базы данных, если ваш сервер и WooCommerce их поддерживают, чтобы избежать проблем с целостностью данных.
  • При тестировании на продакшене сначала отключите автоматический запуск и запускайте функцию вручную, чтобы проверить логику.
  • Рассмотрите возможность интеграции с плагинами для отчетности и мониторинга заказов, например, Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpexpert.ru&utm_medium=article&utm_campaign=woocommerce-kak-ustanovit-i-nastroit-avtomaticheskoe-vozvrashhenie-deneg-posle-nepodtverzhdennyh-zakazov), чтобы улучшить управление процессом.

Сравнение вариантов реализации автоматического возврата

ВариантПлюсыМинусы
Ручное управление возвратамиПолный контроль, минимальный риск ошибокТрудозатратно, медленно, риск пропуска заказов
Плагины автоматизации возвратовПростота настройки, готовый функционалЗависимость от сторонних разработчиков, возможны конфликты
Код на functions.php с WP-CronГибкость, полный контроль, отсутствие сторонних плагиновНеобходимы навыки программирования, возможные проблемы с WP-Cron
Как изменить структуру ссылок в WordPress без потери позиций в поиске
18.03.2026
Оптимизация изображений в WordPress для ускорения сайта
04.02.2026
WooCommerce: автоматическое удаление зависших вариантов товаров с нулевым запасом
04.07.2026
WooCommerce: автоматический возврат денег по неподтверждённым заказам
20.07.2026
WooCommerce: автоматическое изменение стоимости товаров после оплаты
20.06.2026