Диагностика проблемы с неподтверждёнными заказами в WooCommerce
В стандартной работе WooCommerce заказы в статусе «Ожидает оплаты» (pending) остаются активными, и покупатели могут вносить оплату в любое время. Это приводит к накоплению множества неоплаченных заказов, что затрудняет управление магазином и влияет на отчёты. Часто возникает необходимость автоматически отменять или блокировать оплату для таких заказов через заданный промежуток времени.
Проверить наличие проблемы можно в админке WooCommerce на странице Заказы. Если там много заказов со статусом pending, которые не переходят в оплаченные, это повод для автоматизации.
Как автоматически отключить оплату неподтверждённых заказов: пошаговое решение
1. Использование крон-задачи для отмены старых заказов
Реализуем функцию, которая будет запускаться по крону и менять статус заказов с pending на cancelled после определённого времени ожидания (например, 24 часа).
function wptasks_cancel_unpaid_orders() {
$args = array(
'status' => 'pending',
'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
'limit' => -1,
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->update_status( 'cancelled', 'Автоматическая отмена неподтверждённого заказа через 24 часа.' );
}
}
add_action( 'wptasks_cancel_unpaid_orders_hook', 'wptasks_cancel_unpaid_orders' );Затем регистрируем крон-событие в functions.php или в плагине:
function wptasks_activate_cron() {
if ( ! wp_next_scheduled( 'wptasks_cancel_unpaid_orders_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wptasks_cancel_unpaid_orders_hook' );
}
}
add_action( 'wp', 'wptasks_activate_cron' );2. Блокировка возможности оплаты для отменённых заказов
Чтобы покупатели не смогли оплатить отменённые заказы, добавим проверку на этапе выбора оплаты:
add_filter( 'woocommerce_payment_gateways', 'wptasks_disable_payment_for_cancelled_orders' );
function wptasks_disable_payment_for_cancelled_orders( $available_gateways ) {
if ( is_admin() ) return $available_gateways;
if ( isset( $_GET['order_pay'] ) ) {
$order_id = absint( $_GET['order_pay'] );
$order = wc_get_order( $order_id );
if ( $order && $order->has_status( 'cancelled' ) ) {
// Отключаем все способы оплаты
return array();
}
}
return $available_gateways;
}Проверка результата после внедрения
- Создайте заказ в статусе «Ожидает оплаты» и измените дату создания на более чем 24 часа назад (через базу или код).
- Запустите вручную крон-функцию или дождитесь её срабатывания.
- Проверьте, что заказ изменил статус на «Отменён» в админке WooCommerce.
- Попытайтесь оплатить отменённый заказ по ссылке /checkout/order-pay/<order_id> — способы оплаты должны быть недоступны.
Частые ошибки и их исправление
- Крон-задача не срабатывает: проверьте, активен ли WP-Cron, или настройте системный cron. Можно проверить запланированные события через плагин WP Crontrol.
- Заказы не меняют статус: убедитесь, что у заказов правильный статус и дата создания корректно сравнивается. Для отладки добавьте в функцию логирование.
- Оплата всё равно доступна для отменённых заказов: проверьте корректность фильтра
woocommerce_payment_gatewaysи условие проверки статуса заказа.
Практические советы по безопасности и производительности
- Для больших магазинов с тысячами заказов ограничьте выборку заказов в функции отмены, чтобы избежать превышения лимитов памяти и времени выполнения.
- Используйте
wp_schedule_single_eventдля запуска отмены заказов вне пиковых часов. - Чтобы избежать конфликтов, не используйте слишком частый cron; достаточно один раз в час.
- В production окружении лучше реализовать отмену заказов через системный cron, отключив WP-Cron (define('DISABLE_WP_CRON', true);).
Сравнение вариантов реализации автоматической отмены заказов
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| WP-Cron (описанный выше) | Прост в реализации, не требует доступа к серверу | Может не сработать при низкой посещаемости сайта | wp_schedule_event + wc_get_orders |
| Системный cron + WP-CLI | Надёжный запуск, подходит для больших магазинов | Требует доступа к серверу и настройки | wp cron event run и wp wc order update |
| Плагин управления заказами | Готовое решение без кода | Может быть платным, не всегда гибко | Плагины типа WooCommerce Order Status Manager |