В чем суть проблемы с неоплаченными заказами в WooCommerce?
В интернет-магазинах на WooCommerce часто возникает ситуация, когда покупатель создает заказ, но не производит оплату. Такие заказы «зависают» в статусе ожидания оплаты, забирая ресурсы и искажая статистику продаж. Особенно критично, если магазин работает с ограниченным запасом товаров или предлагает акции с ограниченным количеством.
Для решения этой задачи требуется автоматическое отключение (отмена) заказов, которые не были оплачены в течение 24 часов после создания.
Диагностика: как определить, что заказы нужно отключать
- Проверьте в админке WooCommerce список заказов со статусом
on-holdилиpending. - Посмотрите, сколько времени они находятся в этом статусе. Если более 24 часов — они кандидаты на автоматическую отмену.
- Убедитесь, что ручная проверка и удаление заказов неудобны, и нужна автоматизация.
Пошаговое решение: как автоматически отключать заказы без оплаты через 24 часа
1. Добавляем крон-задачу в WordPress
Для выполнения регулярной проверки создадим пользовательскую задачу cron, которая будет запускаться, например, каждые час.
if (!wp_next_scheduled('wc_auto_cancel_unpaid_orders')) {
wp_schedule_event(time(), 'hourly', 'wc_auto_cancel_unpaid_orders');
}2. Обрабатываем заказы в задании
Создаем функцию, которая найдет все неоплаченные заказы старше 24 часов и переведет их в статус cancelled.
add_action('wc_auto_cancel_unpaid_orders', 'wc_cancel_unpaid_orders_after_24h');
function wc_cancel_unpaid_orders_after_24h() {
$args = array(
'limit' => -1,
'status' => array('pending', 'on-hold'),
'date_created' => '<' . (time() - 24 * 60 * 60),
);
$orders = wc_get_orders($args);
foreach ($orders as $order) {
// Проверяем, что заказ действительно не оплачен
if (!$order->is_paid()) {
$order->update_status('cancelled', 'Автоматическое отключение из-за отсутствия оплаты более 24 часов');
}
}
}3. Добавляем очистку при деактивации плагина (если код в плагине)
register_deactivation_hook(__FILE__, function() {
wp_clear_scheduled_hook('wc_auto_cancel_unpaid_orders');
});Проверка результата после внедрения
- Создайте тестовый заказ со статусом
pendingилиon-hold. - Измените дату создания заказа в базе данных вручную на дату более 24 часов назад (через phpMyAdmin или WP CLI).
- Запустите крон-задачу вручную (через WP CLI или временно добавьте вызов функции в код).
- Проверьте, что статус заказа изменился на
cancelled. - Отслеживайте логи и уведомления администратора при автоматическом изменении.
Частые ошибки и как их исправить
- Задача не запускается автоматически: Проверьте, что WP Cron работает. На некоторых серверах cron отключен, тогда настройте системный cron на вызов
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron. - Заказы не находятся по дате создания: В функции
wc_get_ordersпараметрdate_createdдолжен быть объектом DateTime или строкой в формате ISO8601, а не timestamp. Исправьте так:$date = new DateTime(); $date->modify('-24 hours'); $args['date_created'] = '<' . $date->format('Y-m-d H:i:s'); - Статус не меняется: Убедитесь, что у вас есть права доступа и что статус
cancelledподдерживается WooCommerce. Если статус кастомный, зарегайте его.
Практические советы по безопасности и производительности
- Не запрашивайте все заказы сразу, если их много — используйте пагинацию в
wc_get_ordersили обрабатывайте партиями. - Добавьте логирование автоматических изменений, чтобы отслеживать действия.
- Ограничьте права на выполнение функции только администраторам.
- Обязательно проверяйте, что заказ не оплачен, прежде чем менять статус.
Сравнение вариантов реализации автоматического отключения заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WooCommerce Order Status Manager + автоматизация) | Готовое решение, интерфейс для настроек | Может быть платным, лишние функции |
| Кастомный код с WP Cron | Точный контроль, легкий, без лишних функций | Требует навыков программирования, нужно контролировать запуск cron |
| Внешний системный cron + WP CLI | Надежный запуск, не зависит от посещений сайта | Дополнительная настройка сервера |