WooCommerce: автоматическое возврат средств по устаревшим заказам

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

В интернет-магазинах на WooCommerce часто возникают ситуации, когда заказ остается неоплаченным или неактивным в течение длительного времени. Это занимает складские запасы, искажает статистику продаж и мешает управлению финансами. Ручное отслеживание таких заказов сложно и требует времени. Автоматизация возврата средств по истекшим или неактивным заказам решает эти проблемы.

Как определить устаревший заказ в WooCommerce

Устаревшие заказы — это, как правило, заказы со статусом on-hold, pending или failed, которые были созданы более определенного периода назад (например, 30 дней). Для точной диагностики:

  • Перейдите в WooCommerce > Заказы.
  • Отфильтруйте по статусам on-hold, pending, failed.
  • Проверьте дату создания заказа.

Если таких заказов много и они не меняют статус, стоит автоматизировать возврат средств и очистку.

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

1. Создание WP-Cron задачи для проверки заказов

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

if ( ! wp_next_scheduled( 'wprobot_auto_refund_expired_orders' ) ) {
    wp_schedule_event( time(), 'daily', 'wprobot_auto_refund_expired_orders' );
}

2. Обработчик задачи: поиск и возврат средств

Добавим функцию, которая найдет заказы старше 30 дней со статусом on-hold или pending и попробует автоматически вернуть средства, если возврат возможен:

add_action( 'wprobot_auto_refund_expired_orders', 'wprobot_process_expired_orders_refund' );

function wprobot_process_expired_orders_refund() {
    $args = [
        'limit' => -1,
        'status' => ['on-hold', 'pending'],
        'date_created' => '<' . (time() - 30 * DAY_IN_SECONDS),
    ];
    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        // Проверяем, есть ли оплаченные платежи
        $payment_method = $order->get_payment_method();
        if ( ! $payment_method ) {
            continue; // Нет оплаты, возврат не нужен
        }

        // Проверяем, можно ли делать возврат
        if ( ! $order->get_total_refunded() < $order->get_total() ) {
            try {
                $refund = wc_create_refund([
                    'amount'         => $order->get_total() - $order->get_total_refunded(),
                    'reason'         => 'Автоматический возврат средств за устаревший заказ',
                    'order_id'       => $order->get_id(),
                    'refund_payment' => true,
                ]);
                if ( is_wp_error( $refund ) ) {
                    error_log('Ошибка возврата для заказа #' . $order->get_id() . ': ' . $refund->get_error_message());
                    continue;
                }
                // Меняем статус заказа на отменен
                $order->update_status('cancelled', 'Заказ автоматически отменен после возврата средств.');
            } catch ( Exception $e ) {
                error_log('Исключение при возврате заказа #' . $order->get_id() . ': ' . $e->getMessage());
            }
        }
    }
}

3. Очистка старых заказов

Чтобы не засорять базу, можно добавить удаление заказов, которые были отменены более 60 дней назад:

add_action( 'wprobot_auto_refund_expired_orders', 'wprobot_cleanup_old_cancelled_orders' );

function wprobot_cleanup_old_cancelled_orders() {
    $args = [
        'limit' => -1,
        'status' => 'cancelled',
        'date_modified' => '<' . (time() - 60 * DAY_IN_SECONDS),
    ];
    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        wp_delete_post( $order->get_id(), true );
    }
}

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

  • Запустите cron вручную, например, через WP-CLI: wp cron event run wprobot_auto_refund_expired_orders.
  • Проверьте логи ошибок (если включены) на предмет возвратов.
  • В WooCommerce > Заказы убедитесь, что статус старых заказов изменился на cancelled.
  • Проверьте историю транзакций в платежной системе — возвраты должны быть инициированы.

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

  • Отсутствие поддержки возвратов платежного шлюза: некоторые методы оплаты (например, наложенный платеж) не поддерживают автоматические возвраты. Проверяйте документацию платежного шлюза.
  • Ошибка wc_create_refund из-за неверных параметров: убедитесь, что сумма возврата не превышает оплаченной, и что заказ имеет статус, допускающий возврат.
  • WP-Cron не работает: на некоторых хостингах cron требует внешнего запуска. Проверьте, срабатывает ли задача через WP-CLI или настройте системный cron.
  • Отсутствие прав у пользователя: если код запускается в контексте, где нет достаточных прав, возврат не пройдет. Запускайте код от имени администратора.

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

  • Регистрируйте и анализируйте ошибки возвратов для своевременного реагирования.
  • Ограничьте количество заказов, обрабатываемых за один запуск, чтобы избежать тайм-аутов (например, добавьте параметр limit в wc_get_orders).
  • Используйте транзакции и обработку исключений, чтобы избежать частичной обработки.
  • Для крупных магазинов рассмотрите использование сторонних сервисов для автоматизации возвратов с вебхуками.

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

МетодПлюсыМинусыРекомендации
Код в functions.phpПолный контроль, бесплатноТребует навыков PHP, возможны ошибкиИспользовать при уверенности в коде
Плагины автоматизации возвратовПростота настройки, поддержкаМогут быть платными, ограниченная гибкостьПодходит для типовых задач
Вебхуки платежных системВысокая надежность, масштабируемостьСложность интеграции, требует навыков APIДля крупных магазинов с IT поддержкой
Как создать автоматический импорт продуктов в WordPress с помощью WP All Import
25.12.2025
Автоматическое создание и отправка отзывов в WordPress с помощью WP Robot
13.01.2026
WooCommerce: автоматическое изменение стоимости и наличия товаров через Webhook с подробным примером
13.06.2026
Как автоматически удалять старые медиафайлы в WordPress
24.03.2026
WooCommerce: автоматическая синхронизация заказов с внешними системами через Webhook
17.07.2026