WooCommerce: автоматическое удаление отменённых заказов с возвратом средств

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

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

Как понять, что нужна автоматизация?

  • Большое количество отменённых заказов, которые больше не нужны.
  • Задержки и ошибки при возврате средств клиентам.
  • Желание снизить нагрузку на базу данных и ускорить отчёты.

Пошаговое решение: автоматическое удаление отменённых заказов с возвратом средств

1. Создаём функцию для возврата средств по отменённому заказу

Обратите внимание: автоматический возврат средств работает только если платёжный шлюз поддерживает REST API или соответствующие функции WooCommerce.

function wc_refund_order_payment( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order || $order->get_status() !== 'cancelled' ) {
        return false;
    }

    // Проверяем, можно ли сделать возврат
    if ( ! $order->get_payment_method() ) {
        return false;
    }

    // Рассчитываем сумму для возврата
    $refund_amount = $order->get_total();
    if ( $refund_amount <= 0 ) {
        return false;
    }

    // Создаём объект возврата
    $refund = wc_create_refund( array(
        'amount'         => $refund_amount,
        'reason'         => 'Автоматический возврат для отменённого заказа',
        'order_id'       => $order_id,
        'refund_payment' => true,
    ) );

    return $refund;
}

2. Добавляем хук, который запускает возврат и удаление заказа

Лучше запускать процесс по cron, чтобы не замедлять пользовательские запросы.

add_action( 'woocommerce_cancelled_order_cleanup', 'wc_auto_refund_and_delete_cancelled_orders' );
function wc_auto_refund_and_delete_cancelled_orders() {
    $args = array(
        'limit'        => -1,
        'status'       => 'cancelled',
        'return'       => 'ids',
    );
    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );

        // Автоматический возврат
        $refund = wc_refund_order_payment( $order_id );
        if ( $refund ) {
            // Удаляем заказ после возврата
            wp_trash_post( $order_id );
        } else {
            // Логируем ошибку, если возврат не выполнен
            error_log('Ошибка возврата для заказа ID: ' . $order_id );
        }
    }
}

// Регистрируем событие cron на ежедневный запуск
if ( ! wp_next_scheduled( 'woocommerce_cancelled_order_cleanup' ) ) {
    wp_schedule_event( time(), 'daily', 'woocommerce_cancelled_order_cleanup' );
}

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

  • Создайте тестовый заказ и отмените его через админку.
  • Убедитесь, что по расписанию (ежедневно) запускается cron-задача — можно проверить в wp-cron.php или с помощью плагина WP Crontrol.
  • Проверьте, что заказ помечается как удалённый (перемещается в корзину).
  • Проверьте историю возвратов в заказе — должен появиться автоматический возврат.
  • Ошибки возврата смотрите в error_log или в логах сервера.

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

  • Возврат не создаётся: платежный шлюз не поддерживает автоматический возврат через API — проверьте документацию вашего шлюза.
  • Функция wc_create_refund возвращает false: проверьте, что сумма возврата корректна и заказ оплачен.
  • Удалённые заказы не исчезают из админки: они перемещаются в корзину, очистите корзину вручную или добавьте автоматическую очистку.
  • Cron-задача не выполняется: убедитесь, что wp-cron включён или настройте системный cron для вызова wp-cron.php.

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

  • Запускайте возврат и удаление только по cron, чтобы не блокировать пользовательские запросы.
  • Логируйте ошибки возвратов в отдельный файл для быстрой диагностики.
  • Ограничьте количество обрабатываемых заказов за один запуск, если их много, чтобы избежать таймаута.
  • Перед удалением заказа убедитесь, что возврат средств прошёл успешно — это предотвращает потерю данных.
  • Регулярно очищайте корзину заказов, чтобы база не раздувалась.

Сравнение вариантов автоматизации удаления отменённых заказов

МетодПлюсыМинусыПример
Плагин для очистки заказовПростота установки, интерфейсЗависимость от стороннего кода, возможные конфликтыAdvanced Order Cleaner
Код с автоматическим возвратом (описанный выше)Контроль, кастомизация, без сторонних зависимостейНеобходимы знания, поддержка кодаФункции wc_create_refund и cron
Ручное удаление и возвратМаксимальный контрольТрудозатратно, риск ошибокАдминка WooCommerce
Как автоматизировать создание резервных копий WordPress с помощью кода
04.03.2026
Как удалить URL доменов во внутренних ссылках WordPress
12.01.2026
WooCommerce: как автоматически удалять отменённые заказы с помощью кода
04.06.2026
WooCommerce: автоматическое отключение отсутствующих вариантов товаров
22.06.2026
Как изменить размер и оптимизировать изображения в WordPress без плагинов
05.01.2026

Обучение разработке на WordPress, как создавать темы, плагины. Подробнее об обучении.