Как автоматически отменять заказы WooCommerce при проблемах с оплатой

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

Почему важно автоматически отменять неоплаченные заказы WooCommerce

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

  • Уменьшить нагрузку на менеджеров;
  • Поддерживать актуальность данных;
  • Автоматически освобождать зарезервированные товары;
  • Избежать ошибок и забытых заказов.

Как WooCommerce обрабатывает статусы заказов и оплату

По умолчанию WooCommerce создает заказ со статусом on-hold или pending при оформлении, и после успешной оплаты меняет статус на processing или completed. Если оплата не прошла, заказ может оставаться в статусе ожидания indefinitely.

Для автоматической отмены нужно отслеживать время ожидания оплаты и менять статус на cancelled после заданного периода.

Реализация автоматической отмены заказов через код

Рассмотрим пример кода, который можно добавить в functions.php вашей темы или в кастомный плагин. Этот скрипт будет запускаться при cron-задаче и отменять заказы в статусе pending старше 24 часов.

function wporders_cancel_old_pending_orders() {
    $args = array(
        'status' => 'pending',
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        $order->update_status( 'cancelled', 'Автоматическая отмена заказа из-за отсутствия оплаты в течение 24 часов' );
    }
}

// Добавляем cron задачу, если не существует
if ( ! wp_next_scheduled( 'wporders_cancel_pending_orders_event' ) ) {
    wp_schedule_event( time(), 'hourly', 'wporders_cancel_pending_orders_event' );
}

add_action( 'wporders_cancel_pending_orders_event', 'wporders_cancel_old_pending_orders' );

Данный код:

  • Поиск заказов с статусом pending, созданных более 24 часов назад;
  • Изменение статуса заказов на cancelled с добавлением примечания;
  • Запуск проверки каждый час через WP-Cron.

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

Вы можете легко изменить период ожидания, заменив DAY_IN_SECONDS на любое другое значение, например, 12 * HOUR_IN_SECONDS для 12 часов. Также можно расширить логику, включив в проверку статусы on-hold, если используете их для неоплаченных заказов.

Пример с расширенным фильтром статусов

function wporders_cancel_old_unpaid_orders() {
    $args = array(
        'status' => array('pending', 'on-hold'),
        'date_created' => '<' . ( time() - 12 * HOUR_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        $order->update_status( 'cancelled', 'Автоматическая отмена неоплаченных заказов через 12 часов' );
    }
}

Использование плагинов для автоматизации отмены заказов

Если вы предпочитаете не использовать код, существуют плагины, которые позволяют настроить автоматическую отмену заказов по времени:

  • Clearfy Pro — оптимизационный плагин с функцией автоматической отмены неоплаченных заказов и расширенными настройками WooCommerce.
  • WPRemark — плагин для управления заказами и уведомлениями, поддерживает автоматизацию статусов.

Такие плагины часто имеют удобный интерфейс для настройки времени ожидания и условий отмены без необходимости писать код.

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

После внедрения кода или подключения плагина обязательно протестируйте работу на тестовой среде. Оформите заказ с оплатой через тестовый режим, проверьте, что статус меняется после указанного времени. Для отладки можно добавить логирование с помощью функции error_log или WP_DEBUG.

Пример логирования в коде

function wporders_cancel_old_pending_orders() {
    $args = array(
        'status' => 'pending',
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        $order->update_status( 'cancelled', 'Автоматическая отмена заказа из-за отсутствия оплаты в течение 24 часов' );
        error_log( 'Order ID ' . $order_id . ' cancelled automatically.' );
    }
}

Это поможет убедиться, что скрипт срабатывает и отменяет заказы.

Рекомендации по безопасности и производительности

WP-Cron запускается при посещении сайта, поэтому если трафик низкий, задачи могут запускаться с задержками. Для критичных случаев лучше настроить системный cron на сервере, вызывающий wp-cron.php.

Также убедитесь, что права доступа к функциям и данным ограничены, и не давайте возможности пользователям непреднамеренно запускать отмену заказов.

Как создать автоматический отчет по заказам WooCommerce с помощью PHP
07.04.2026
Как отладить проблемы с заказами WooCommerce: пошаговое руководство и примеры кода
13.12.2025
Как автоматически отменять заказы WooCommerce при проблемах с оплатой
17.04.2026
Как создать автоматический отчет по заказам в WordPress без WooCommerce
10.04.2026
Массовое обновление статусов заказов в WooCommerce: практическое руководство
17.05.2026