WooCommerce: как автоматически обрабатывать возвраты и отмены заказов

|

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

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

Основные признаки проблемы:

Пошаговое решение: Автоматизация обработки возвратов и отмен заказов с помощью кода

1. Определяем критерии автоматической отмены и возврата

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

2. Добавляем крон-задачу для проверки и обновления статусов

В functions.php или в собственном плагине регистрируем задачу, которая раз в сутки проверяет заказы и отменяет просроченные:

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

add_action( 'auto_cancel_unpaid_orders', 'auto_cancel_unpaid_orders_callback' );

function auto_cancel_unpaid_orders_callback() {
    $args = [
        'limit' => -1,
        'status' => ['pending', 'on-hold'],
        'date_created' => '<' . ( time() - WEEK_IN_SECONDS ),
    ];

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        $order->update_status( 'cancelled', 'Автоматическая отмена неоплаченного заказа через 7 дней.' );
        // При необходимости можно добавить логику возврата средств здесь
    }
}

3. Автоматический возврат средств для оплаченных заказов

Если требуется автоматизировать возврат средств (refund), то для заказов со статусом processing или completed можно добавить функцию:

function auto_refund_order( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) return;

    if ( in_array( $order->get_status(), ['processing', 'completed'] ) ) {
        // Проверяем, что возврат еще не был выполнен
        if ( ! $order->has_status('refunded') ) {
            $refund = wc_create_refund( [
                'amount' => $order->get_total(),
                'reason' => 'Автоматический возврат',
                'order_id' => $order_id,
            ] );

            if ( is_wp_error( $refund ) ) {
                error_log('Ошибка возврата для заказа ' . $order_id . ': ' . $refund->get_error_message());
            } else {
                $order->update_status( 'refunded', 'Автоматический возврат средств.' );
            }
        }
    }
}

Вызывайте эту функцию в нужный момент, например, по крону или вручную при необходимости.

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

Чтобы проверить, что автоматизация работает:

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

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

Сравнение подходов: плагин vs код vs компромисс

МетодПлюсыМинусыРекомендации
Плагин (например, WooCommerce Auto Cancel)Простая установка, готовый функционал, поддержка обновленийМожет быть избыточным, влияет на производительность, зависит от стороннего кодаПодходит для быстрого запуска без навыков программирования
Код в functions.php или плагинеТочный контроль, легковесность, гибкостьТребует навыков, возможны ошибки без тестированияРекомендуется для опытных разработчиков и кастомных решений
КомпромиссИспользование легких плагинов с кастомными доработкамиПотребуется сопровождение, возможно сложнее обновлятьПодходит для средних проектов с частыми изменениями
Как установить ограничение по числу публикаций на странице архива WordPress
15.03.2026
Как добавить AJAX в формы WordPress без плагинов
15.12.2025
Как автоматически удалять неактивных пользователей WordPress
23.03.2026
Как создать главный вывод текстовой информации в WordPress без плагинов
22.01.2026
WooCommerce: как изменить вид отображения товара в списке заказов без плагинов
10.07.2026
×
-15%
на премиум плагин
Clearfy

Защитите сайт!

Включить Clearfy »