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

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

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

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

Под «устаревшими» обычно понимают заказы, в которых статус не менялся определенное время (например, 30 дней), либо заказы со статусом «в ожидании» или «обработка», которые не были завершены.

Для диагностики можно выполнить SQL-запрос в базе данных, чтобы увидеть количество таких заказов:

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-processing') AND post_date < NOW() - INTERVAL 30 DAY;

Если таких заказов много — пора автоматизировать возврат средств.

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

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

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

function wprobot_auto_refund_old_orders() {
    $args = [
        'status'        => ['wc-pending', 'wc-processing'],
        'date_created'  => '<' . ( new WC_DateTime() )->modify('-30 days')->date('Y-m-d H:i:s'),
        'limit'         => -1,
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        if ($order->get_total_refunded() >= $order->get_total()) {
            continue; // Уже возвращено
        }

        $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('refunded', 'Автоматический возврат средств по истечении 30 дней.');
    }
}

add_action('wprobot_daily_auto_refund', 'wprobot_auto_refund_old_orders');

2. Регистрация ежедневного события WP-Cron

Чтобы функция запускалась автоматически, добавим регистрацию крон-задачи:

function wprobot_schedule_auto_refund() {
    if (! wp_next_scheduled('wprobot_daily_auto_refund')) {
        wp_schedule_event(time(), 'daily', 'wprobot_daily_auto_refund');
    }
}
add_action('wp', 'wprobot_schedule_auto_refund');

3. Отмена задачи при деактивации плагина

Если вы реализуете в плагине, не забудьте очистить крон-задачу:

function wprobot_clear_auto_refund_schedule() {
    $timestamp = wp_next_scheduled('wprobot_daily_auto_refund');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wprobot_daily_auto_refund');
    }
}
register_deactivation_hook(__FILE__, 'wprobot_clear_auto_refund_schedule');

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

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

  • Создайте тестовый заказ со статусом «Ожидает оплаты» или «В обработке» и датой старше 30 дней (можно вручную изменить дату в базе или с помощью плагина для редактирования дат).
  • Принудительно запустите крон-задачу через WP-CLI: wp cron event run wprobot_daily_auto_refund или используйте плагин для управления WP-Cron.
  • Проверьте, что заказ получил статус «refunded» и создан возврат средств, а также записи в журнале ошибок отсутствуют.

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

  • Ошибка: Возврат не создаётся, появляется ошибка refund_payment.
    Причина: Метод оплаты не поддерживает автоматический возврат или отсутствует подключение к платёжному шлюзу.
    Решение: Проверьте настройки платежного шлюза, убедитесь, что API ключи актуальны.
  • Ошибка: Крон-задача не запускается.
    Причина: WP-Cron запускается при посещении сайта, если трафика мало — задачи не выполняются.
    Решение: Настройте системный cron на сервере для вызова wp-cron.php.
  • Ошибка: Статус заказа не меняется после возврата.
    Причина: В коде не обновился статус или конфликт с другим плагином.
    Решение: Логируйте ошибки, временно отключите плагины, влияющие на статусы заказов.

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

  • Используйте транзакции и проверки ошибок при создании возвратов, чтобы избежать частичного выполнения кода.
  • Ограничьте количество заказов в одном запуске, чтобы избежать таймаутов сервера (например, limit 20-50).
  • Логируйте события возвратов в отдельный файл для аудита и отладки.
  • Проверьте совместимость с другими плагинами, особенно с кэшированием и оптимизацией.

Сравнение вариантов автоматизации возврата средств

МетодПлюсыМинусыКомпромисс
Ручной возвратПолный контроль, простотаТрудозатратно, ошибки человекаПодходит для малого магазина
Плагины автоматизации (например, WooCommerce Smart Refunder)Удобство, настройки из админкиДоп. нагрузка, платные решенияХорошо для средних магазинов
Кастомный код (как в статье)Гибкость, отсутствие доп. затратТребует навыков, поддержка кодаОптимально для разработчиков и крупных проектов
Как автоматически отслеживать изменения файлов в WordPress с помощью Watchdog
14.02.2026
Автоматическое удаление неактивных заказов в WooCommerce: пошаговое руководство
29.04.2026
Автоматическое обновление остатка и цены товаров WooCommerce через Webhook
22.04.2026
Как автоматизировать создание записей в WordPress с помощью роботов
03.11.2025
Как автоматически создавать персонализированные сообщения в WordPress
06.03.2026