Что такое отложенные заказы в WooCommerce и зачем их отключать
Отложенные заказы — это заказы, которые были созданы, но клиент не завершил оплату или оформление. Они занимают место в базе, могут влиять на аналитику и создавать путаницу в админке. Автоматическое отключение или удаление таких заказов помогает поддерживать базу данных в чистоте и облегчает управление магазином.
Диагностика проблемы с отложенными заказами
Для начала нужно понять, есть ли в вашем магазине отложенные заказы и как долго они висят без активности.
- Зайдите в WooCommerce → Заказы и отфильтруйте по статусу
pending(ожидает оплаты) илиon-hold. - Оцените, сколько таких заказов и как давно они созданы.
- Проверьте, не создаются ли новые отложенные заказы регулярно и не мешают ли они обработке продаж.
Как проверить время создания отложенных заказов через SQL
SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold') ORDER BY post_date ASC;Это позволит увидеть, какие заказы висят дольше всего.
Пошаговое решение: автоматическое отключение отложенных заказов через код
Реализуем через хук WordPress планировщик cron, который будет запускаться ежедневно и менять статус старых отложенных заказов на отменённые.
Добавляем cron-задачу в functions.php вашей темы или в собственный плагин
if ( ! wp_next_scheduled( 'wc_auto_cancel_pending_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wc_auto_cancel_pending_orders' );
}
add_action( 'wc_auto_cancel_pending_orders', 'wc_auto_cancel_pending_orders_function' );
function wc_auto_cancel_pending_orders_function() {
$days_to_cancel = 3; // Кол-во дней, после которых заказ отменяется
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days_to_cancel} days" ) );
$args = array(
'limit' => -1,
'status' => array('pending', 'on-hold'),
'date_created' => '<' . $date,
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->update_status( 'cancelled', 'Автоматическая отмена старого отложенного заказа' );
}
}Объяснение
wp_schedule_eventсоздаёт ежедневное событие.wc_get_ordersполучает заказы с нужным статусом и датой создания.update_statusменяет статус заказа наcancelled.
Проверка результата после внедрения
Чтобы проверить, работает ли скрипт:
- Создайте тестовый заказ с статусом
pending. - Измените дату создания заказа в базе данных на дату более трёх дней назад (через phpMyAdmin или WP-CLI).
- Запустите cron вручную с помощью WP-CLI:
wp cron event run wc_auto_cancel_pending_orders. - Проверьте, что статус заказа изменился на
cancelledв админке WooCommerce.
Частые ошибки и как их исправить
- Заказы не изменяют статус: Проверьте, что cron-задание действительно запускается. Для отладки добавьте запись в лог внутри функции.
- Функция не работает из-за неправильного статуса: WooCommerce использует статусы с префиксом
wc-, но дляwc_get_ordersдостаточно указать «pending» или «on-hold». - Заказы не попадают в выборку из-за временной зоны: Убедитесь, что дата сравнения учитывает временную зону WordPress (
current_time('mysql')можно использовать вместоdate()). - Конфликт с другими плагинами: Временно отключите другие плагина, влияющие на заказы, чтобы проверить взаимодействие.
Практические советы по безопасности и производительности
- Не запускайте обработку большого количества заказов без лимита — это может замедлить сайт. Если заказов много, реализуйте обработку пакетами.
- Добавьте логирование в файл для мониторинга работы задачи (через
error_log()или сторонний логгер). - Проверьте, что у пользователя, под которым работает cron, есть права на изменение заказов.
- Если хотите убрать заказы полностью, сначала делайте резервную копию базы данных.
Сравнение вариантов автоматического отключения отложенных заказов
| Способ | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Код с wp_schedule_event | Гибко, без сторонних плагинов, можно кастомизировать | Нужны базовые знания PHP, возможны ошибки при неправильной настройке | Лучше для разработчиков и кастомных решений |
| Плагины автоматизации заказов (например, WooCommerce Cancel Abandoned Order) | Простая настройка, интерфейс в админке | Может грузить сайт, зависит от обновлений плагина | Подходит новичкам и для быстрого внедрения |
| Ручное удаление через SQL | Быстро для разовых задач | Риск потери данных, требует доступа к базе, не автоматично | Использовать с осторожностью и только для миграций |