Проблемы с оплатой — одна из частых причин, по которым заказы в 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.
Также убедитесь, что права доступа к функциям и данным ограничены, и не давайте возможности пользователям непреднамеренно запускать отмену заказов.