Почему важно автоматически отменять неоплаченные заказы в WooCommerce?
В интернет-магазинах на WooCommerce нередко накапливаются неоплаченные заказы — клиенты оформляют заказ, но не завершают оплату. Это приводит к «зависанию» товаров в заказах, блокируя их для других покупателей и искажая статистику продаж. Автоматическая отмена таких заказов позволяет поддерживать актуальность данных, освобождает склад и снижает нагрузку на администраторов.
Диагностика проблемы с неоплаченными заказами
Чтобы понять, нужно ли автоматизировать отмену, проверьте следующие моменты:
- Сколько заказов в вашем WooCommerce находятся в статусе
on-holdилиpendingдольше 24-48 часов. - Используется ли у вас плагин оплаты, который не меняет статус автоматически после неудачной оплаты.
- Отсутствуют ли уведомления для админа о неоплаченных заказах.
Для быстрой проверки можно использовать SQL-запрос в базе данных:
SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold');Если таких заказов много и они долго не меняют статус, стоит автоматизировать отмену.
Пошаговое решение: автоматическая отмена заказов через WP-Cron
Добавим в тему или плагин следующий код, который ежедневно будет отменять неоплаченные заказы старше 24 часов.
1. Регистрируем Cron-задачу
add_action('wp', 'setup_cancel_unpaid_orders_cron');
function setup_cancel_unpaid_orders_cron() {
if (!wp_next_scheduled('cancel_unpaid_orders_daily_event')) {
wp_schedule_event(time(), 'daily', 'cancel_unpaid_orders_daily_event');
}
}2. Основная функция отмены заказов
add_action('cancel_unpaid_orders_daily_event', 'cancel_unpaid_orders');
function cancel_unpaid_orders() {
$args = array(
'limit' => -1,
'status' => array('pending', 'on-hold'),
'date_created' => '<' . (time() - 24 * HOUR_IN_SECONDS),
);
$orders = wc_get_orders($args);
foreach ($orders as $order) {
// Меняем статус заказа на отмененный
$order->update_status('cancelled', 'Заказ автоматически отменён из-за неоплаты более 24 часов.');
}
}3. Очистка Cron-задачи при деактивации
register_deactivation_hook(__FILE__, function () {
$timestamp = wp_next_scheduled('cancel_unpaid_orders_daily_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'cancel_unpaid_orders_daily_event');
}
});Как проверить, что автоматизация работает
- Создайте тестовый заказ со статусом
pendingилиon-hold. - Вручную измените дату создания заказа в базе данных, чтобы она была старше 24 часов (через phpMyAdmin или WP CLI).
- Вызовите Cron-задачу вручную с помощью плагина WP Crontrol или через WP CLI:
wp cron event run cancel_unpaid_orders_daily_event. - Проверьте, что статус заказа изменился на
cancelledи в комментариях заказа появилась запись об автоматической отмене.
Частые ошибки и их исправление
- Крон-задача не запускается: убедитесь, что на сайте включён WP-Cron (параметр
DISABLE_WP_CRONне установлен вtrue), и что есть посещения сайта для активации Cron. - Неверный выбор заказов: в функции
wc_get_ordersважно правильно указатьdate_createdчерез массив или строку. В нашем примере мы используем строку с оператором <, что поддерживается с WooCommerce 3.0+. Если не работает, можно использовать фильтрацию вручную. - Заказы не меняют статус: проверьте, что у пользователя, под которым работает Cron, есть права на редактирование заказов и что нет конфликтов с другими плагинами.
Чек-лист внедрения автоматической отмены заказов
- Добавлен и активирован код с Cron-задачей.
- Проверена корректность выбора статусов и времени.
- Проведено тестирование на тестовом заказе.
- Проверена работа Cron через WP Crontrol или WP CLI.
- Обеспечена очистка Cron при деактивации плагина/темы.
Советы по безопасности и производительности
- Ограничьте частоту запуска Cron для снижения нагрузки — например, ежедневно, как в примере.
- Логи изменений можно направлять в отдельный файл или использовать встроенный лог WooCommerce для аудита.
- Не изменяйте статус заказов автоматически без проверки времени — это может привести к отмене актуальных заказов.
- При больших объемах заказов используйте постраничную обработку (пагинацию) вместо загрузки всех заказов за раз.
Альтернативы: плагины или кастомный код?
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код, как в статье | Полный контроль, нет дополнительных плагинов, легкий и настраиваемый | Требуется базовые знания PHP и Cron, может не подойти для очень больших магазинов |
| Плагины (например, WooCommerce Cancel Abandoned Order) | Готовое решение, с настройками из админки, поддержка обновлений | Может быть избыточным, нагрузка, зависимость от сторонних разработчиков |