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

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

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

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

Как определить неподтверждённые заказы и таймаут отключения оплаты

В WooCommerce статус заказов, ожидающих оплаты, обычно pending или on-hold. Для автоматического отключения оплаты нужно понимать, сколько времени заказ остаётся в таком статусе. Обычно разумный таймаут — 24 часа, но можно настроить индивидуально.

Узнать статус заказа и время создания можно так:

$order = wc_get_order( $order_id );
$status = $order->get_status();
$created = $order->get_date_created();
// $created - объект DateTime

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

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

Нужно написать функцию, которая будет запускаться по крону (wp_cron) и менять статус неподтверждённых заказов на «отменён» или «отклонён» после истечения таймаута. Это автоматически предотвратит дальнейшую оплату.

function wptasks_auto_cancel_unpaid_orders() {
    $timeout_hours = 24; // Время ожидания в часах
    $args = array(
        'status' => array('pending', 'on-hold'),
        'limit' => -1,
        'date_created' => '<' . ( new WC_DateTime( '-'. $timeout_hours .' hours' ) )->date('Y-m-d H:i:s'),
    );

    $orders = wc_get_orders($args);

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

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

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

function wptasks_schedule_cron() {
    if (!wp_next_scheduled('wptasks_hourly_event')) {
        wp_schedule_event(time(), 'hourly', 'wptasks_hourly_event');
    }
}
add_action('wp', 'wptasks_schedule_cron');

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

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

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

  • Создайте тестовый заказ и оставьте его в статусе «pending» или «on-hold».
  • Проверьте, что прошло более 24 часов (можно вручную изменить время создания заказа в базе для теста).
  • Запустите вручную cron событие: do_action('wptasks_hourly_event'); либо дождитесь автоматического запуска.
  • Проверьте, что статус заказа изменился на «cancelled».
  • Убедитесь, что на странице оформления заказа для отменённого заказа оплата больше не доступна.

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

  • Функция не запускается по расписанию: Проверьте, что wp_cron активен и нет ограничения на запуск задач на хостинге. Для теста можно вызвать функцию вручную через do_action.
  • Заказы не обновляются: Убедитесь, что правильно указаны статусы заказов и дата создания заказа корректна. Для фильтрации date_created используйте формат Y-m-d H:i:s.
  • Статус заказа меняется, но оплата всё равно доступна: Проверьте настройки WooCommerce и кэширование сайта, возможно, нужно очистить кэш, чтобы изменения вступили в силу.

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

  • Не устанавливайте слишком короткий таймаут — это может привести к отмене заказов, которые клиент ещё собирается оплатить.
  • Добавьте в уведомления клиенту сообщение о том, что заказ будет отменён, если не будет подтверждён в течение 24 часов.
  • Оптимизируйте выборку заказов с помощью правильных индексов в базе данных, если на сайте много заказов.
  • Для больших магазинов рассмотрите использование WP-Cron с системным cron для гарантированного запуска задач.

Сравнение вариантов реализации отключения оплаты

МетодОписаниеПлюсыМинусы
Использование wp_cron и update_status Автоматическое изменение статуса заказов через задачу cron Простая реализация, автоматизация Зависит от работы wp_cron, возможна задержка
Ручное изменение статусов Администратор меняет статусы вручную Полный контроль Трудоёмко, неэффективно на больших сайтах
Использование сторонних плагинов Плагины для управления заказами и статусами автоматически Готовые решения с расширенным функционалом Зависимость от обновлений, возможные конфликты
Автоматическое удаление старых записей по метаключам в WordPress
24.03.2026
Как использовать хуки WordPress для автоматизации задач
11.04.2026
Как создать автоматический импорт данных из CSV в WordPress с применением WPTasks
26.02.2026
WooCommerce: автоматическое отключение оплаты при неподтверждённом заказе с помощью WP-Cron
20.07.2026
Автоматический импорт файлов из Яндекс.Диска в WordPress
02.03.2026