Диагностика проблемы: зачем отключать неоплаченные заказы
В интернет-магазинах на WooCommerce часто возникает ситуация, когда заказ создаётся, но клиент не завершает оплату. Такие заказы занимают ресурсы магазина, могут исказить статистику и портить опыт управления запасами. Автоматическое отключение (отмена) таких заказов через определённое время — важный элемент контроля.
Проверьте, что в вашем магазине есть неоплаченные заказы с статусом pending или on-hold, которые висят более 24 часов. Для этого:
- Перейдите в WooCommerce → Заказы.
- Отфильтруйте заказы по статусу
Ожидает оплатыилиВ ожидании. - Посмотрите дату создания заказов — если есть старые, которые не оплачены, задача актуальна.
Пошаговое решение: автоматическое отключение заказов через wp-cron
1. Создаём функцию для отмены неоплаченных заказов
Добавьте следующий код в файл functions.php вашей темы или в собственный плагин:
function wc_auto_cancel_unpaid_orders() {
$args = array(
'status' => array('pending', 'on-hold'),
'date_created' => '<' . ( new WC_DateTime( '-24 hours' ) )->format( 'Y-m-d H:i:s' ),
'limit' => -1,
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
if ( ! $order->has_status( 'cancelled' ) ) {
$order->update_status( 'cancelled', 'Автоматическое отключение заказа из-за отсутствия оплаты более 24 часов.' );
}
}
}2. Регистрируем событие wp-cron для запуска функции
Добавьте хук для периодического выполнения:
if ( ! wp_next_scheduled( 'wc_auto_cancel_unpaid_orders_event' ) ) {
wp_schedule_event( time(), 'hourly', 'wc_auto_cancel_unpaid_orders_event' );
}
add_action( 'wc_auto_cancel_unpaid_orders_event', 'wc_auto_cancel_unpaid_orders' );3. Отмена события при деактивации темы или плагина
Чтобы избежать дублирования событий, можно добавить очистку планировщика:
function wc_auto_cancel_unpaid_orders_deactivation() {
$timestamp = wp_next_scheduled( 'wc_auto_cancel_unpaid_orders_event' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wc_auto_cancel_unpaid_orders_event' );
}
}
register_deactivation_hook( __FILE__, 'wc_auto_cancel_unpaid_orders_deactivation' );Проверка результата после внедрения
- Создайте тестовый заказ с оплатой, установленной в статус
pending. - Измените дату создания заказа в базе данных, чтобы она была старше 24 часов, или подождите час, если хотите тестировать по-настоящему.
- Запустите вручную функцию из консоли или временно вызовите её в
functions.php(например, через AJAX или wp-cli). - Проверьте, сменился ли статус заказа на
cancelled. - Убедитесь, что в админке WooCommerce в комментариях к заказу появился системный комментарий об отмене.
Частые ошибки и как их исправить
- Заказы не отменяются: Убедитесь, что wp-cron работает на сервере. Для этого можно вызвать вручную
wp cron event run --due-nowчерез wp-cli. - Дублирование событий: Проверяйте, чтобы хук планировщика создавался только один раз, иначе функция будет запускаться несколько раз в час и нагружать сервер.
- Статусы заказов: Проверьте, что вы указали правильные статусы в фильтре (
pending,on-hold), иначе нужные заказы не попадут под отмену. - Проблемы с временной зоной: Используйте класс
WC_DateTimeдля корректной работы с датами в WooCommerce.
Практические советы по безопасности и производительности
- Не запускайте функцию слишком часто — оптимально раз в час, чтобы не создавать лишнюю нагрузку.
- Для магазинов с большим количеством заказов используйте пагинацию (
'limit' => 100и смещение), чтобы избежать таймаута. - Ограничьте права пользователя, под которым запускается wp-cron, чтобы исключить возможность злоупотреблений.
- Для дополнительной безопасности можно логировать отменённые заказы в отдельную таблицу или файл для аудита.
Сравнение вариантов автоматического отключения заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код с wp-cron | Самописное решение с регулярным запуском функции отмены | Гибкость, нет зависимостей от плагинов, легко кастомизируется | Зависимость от корректной работы wp-cron, нужен базовый PHP-кодинг |
| Плагины типа "Auto Cancel Orders" | Готовые решения с настройками в админке | Простая установка, настройка без кода | Могут создавать нагрузку, ограниченная кастомизация, лишний плагин |
| Ручная очистка через админку | Отмена заказов вручную через интерфейс WooCommerce | Простота без кода | Трудозатратно, не подходит для больших магазинов |