WooCommerce: автоматическое отключение оплаты при неподтверждении заказа

Проблема: почему нужно отключать оплату при неподтвержденном заказе

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

Диагностика: как определить неподтвержденные заказы

Для начала необходимо проверить, сколько заказов находится в статусе "ожидание оплаты" (pending) или "обработка" (processing) дольше установленного времени (например, 24 часа). Это можно сделать через SQL-запрос к базе данных или с помощью WP-CLI:

wp wc order list --status=pending --format=ids

Или напрямую в базе данных, например, чтобы получить заказы старше 24 часов:

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

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

Пошаговое решение: автоматическое отключение оплаты для неподтвержденных заказов

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

Добавим в файл functions.php вашей темы или лучше в кастомный плагин следующий код, который будет менять статус заказов с wc-pending на wc-cancelled, если они старше 24 часов:

function auto_cancel_unpaid_orders() {
    $args = [
        'limit'        => -1,
        'status'       => 'pending',
        'date_created' => '<' . ( new WC_DateTime() )->modify( '-1 day' )->format( 'Y-m-d H:i:s' ),
    ];

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        $order->update_status( 'cancelled', 'Автоматическое отключение оплаты: заказ не был подтвержден более 24 часов.' );
    }
}

2. Настраиваем регулярное выполнение через WP-Cron

Добавим событие, которое будет запускать эту функцию ежедневно:

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

add_action( 'auto_cancel_unpaid_orders_hook', 'auto_cancel_unpaid_orders' );

3. Опционально: уведомление администратора о выполнении скрипта

Чтобы отслеживать работу скрипта, добавим отправку email:

function auto_cancel_unpaid_orders() {
    $args = [
        'limit'        => -1,
        'status'       => 'pending',
        'date_created' => '<' . ( new WC_DateTime() )->modify( '-1 day' )->format( 'Y-m-d H:i:s' ),
    ];

    $orders = wc_get_orders( $args );
    $count = 0;

    foreach ( $orders as $order ) {
        $order->update_status( 'cancelled', 'Автоматическое отключение оплаты: заказ не был подтвержден более 24 часов.' );
        $count++;
    }

    if ( $count ) {
        wp_mail( get_option( 'admin_email' ), 'Автоматическая отмена заказов WooCommerce', "Отменено заказов: $count" );
    }
}

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

Чтобы проверить, что решение работает, сделайте следующее:

  • Создайте тестовый заказ и оставьте его в статусе "ожидание оплаты".
  • Измените дату создания заказа в базе данных на более раннюю (например, на 2 дня назад).
  • Запустите вручную cron-задачу, вызвав функцию из консоли или временно добавив вызов функции в functions.php.
  • Проверьте, что статус заказа изменился на "отменен" (cancelled).
  • Проверьте почту администратора на наличие уведомления.

Частые ошибки и пути их устранения

  • Функция не запускается автоматически: проверьте, активирован ли wp-cron (в файле wp-config.php не должно быть define('DISABLE_WP_CRON', true);). Если wp-cron отключен, настройте системный cron на сервере.
  • Заказы не меняют статус: убедитесь, что у заказов правильный статус (wc-pending), и что дата создания корректна. Проверьте права пользователя, под которым запускается скрипт.
  • Письма не отправляются: проверьте настройки почты сервера и функцию wp_mail. Можно подключить SMTP-плагин для надежной отправки.

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

  • Для больших магазинов с тысячами заказов используйте пагинацию в запросах, чтобы не перегружать память:
$args = [
    'limit' => 50,
    'paged' => $page_number,
    'status' => 'pending',
    'date_created' => '<' . ( new WC_DateTime() )->modify( '-1 day' )->format( 'Y-m-d H:i:s' ),
];
  • Всегда используйте child-тему или собственный плагин для добавления кода, чтобы не потерять изменения при обновлении.
  • Резервное копирование базы перед изменениями — обязательный пункт.
  • Для уведомлений используйте фильтры и шаблоны, чтобы письма были информативными.

Альтернативные варианты реализации

МетодПлюсыМинусы
Плагин автоматической отмены заказовБыстрая установка, интерфейсМожет быть избыточным, нагрузка на сайт
Собственный код с WP-Cron (текущий вариант)Легковесно, точечное решение, кастомизацияТребует навыков, настройка cron
Ручное управление заказамиПолный контрольТрудозатратно, риск ошибок
Как автоматизировать создание задач в WordPress с помощью плагинов
08.11.2025
Как создать собственный шорткод в WordPress
04.11.2025
Как автоматизировать создание и управление задачами в WordPress с помощью WPTasks
14.01.2026
Как создать адаптивную тему WordPress с низкой загрузкой
25.11.2025
Как создать автоматический импорт данных из CSV в WordPress с применением WPTasks
26.02.2026