Проблема: отложенные оплаты в WooCommerce не отключаются автоматически
В стандартной комплектации WooCommerce не предусматривает автоматического отключения отложенных оплат, если клиент не завершил оплату в установленный срок. Это может привести к накоплению неоплаченных заказов, которые занимают ресурсы и мешают корректному учету.
Диагностика проблемы
Чтобы убедиться, что отложенные оплаты не отключаются автоматически, нужно проверить следующие моменты:
- Существуют ли неоплаченные заказы со статусом
on-holdилиpending, которые не меняют статус длительное время. - Нет ли сторонних плагинов, которые должны были бы обрабатывать эти статусы.
- Отсутствие настроек автоматического удаления или отмены таких заказов в WooCommerce или хостинге.
Для проверки выполните SQL-запрос к базе данных WordPress (через phpMyAdmin или WP-CLI):
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold') ORDER BY post_date ASC;Если в результате вы увидите заказы, которые висят в статусе неоплаченного более нескольких дней, то это подтверждает проблему.
Как автоматически отключать отложенные оплаты с помощью кода
Реализуем cron-задачу, которая будет проверять заказы в статусе pending или on-hold старше заданного времени (например, 24 часа) и менять их статус на cancelled.
Шаг 1. Добавление кастомного cron-события
add_action('wp', function() {
if (!wp_next_scheduled('auto_cancel_delayed_payments')) {
wp_schedule_event(time(), 'hourly', 'auto_cancel_delayed_payments');
}
});Шаг 2. Создание функции отмены просроченных заказов
add_action('auto_cancel_delayed_payments', function() {
$args = [
'limit' => -1,
'status' => ['pending', 'on-hold'],
'date_created' => '<' . (time() - 24 * 3600), // старше 24 часов
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->update_status('cancelled', 'Автоматическая отмена просроченного отложенного платежа.');
}
});Шаг 3. Очистка cron при деактивации темы или плагина
register_deactivation_hook(__FILE__, function() {
$timestamp = wp_next_scheduled('auto_cancel_delayed_payments');
if ($timestamp) {
wp_unschedule_event($timestamp, 'auto_cancel_delayed_payments');
}
});Проверка результата после внедрения
Чтобы проверить, что автоматическое отключение работает, создайте тестовый заказ с отложенной оплатой и установите дату создания заказа на более чем 24 часа назад (через базу данных или вручную изменив время тестового заказа).
Далее запустите cron вручную через WP-CLI:
wp cron event run auto_cancel_delayed_paymentsПосле выполнения проверьте статус заказа в админке WooCommerce — он должен смениться на cancelled.
Частые ошибки и причины
- Отсутствие cron-задачи: Если cron не запускается, проверьте, что на сайте не отключены WP-Cron или настроен системный cron. Можно добавить в
wp-config.phpdefine('DISABLE_WP_CRON', false);или настроить системный cron. - Некорректный фильтр даты: В параметре
date_createdнужно использовать корректный формат. В примере выше используется timestamp, который WooCommerce умеет интерпретировать. - Кэширование: Плагины кэширования могут мешать своевременному выполнению cron-задач, временно отключите их при отладке.
Практические советы по безопасности и производительности
- Ограничьте частоту выполнения задачи — достаточно один раз в час для большинства магазинов.
- Добавьте логирование отмененных заказов в отдельный файл для аудита и отладки.
- Если заказов много, реализуйте пакетную обработку, чтобы избежать таймаутов и нагрузок.
- Используйте транзиенты или опции для хранения состояния последнего запущенного заказа, чтобы не обходить всю базу каждый раз.
Сравнение подходов автоматического отключения отложенных оплат
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин автоматизации | Быстрая установка, готовые настройки | Зависимость от стороннего кода, может нагружать сайт |
| Код в теме/плагине (как в статье) | Контроль, лёгкая кастомизация, без лишних зависимостей | Требует базовых знаний PHP и WooCommerce API |
| Ручное управление через админку | Простота, не требует программирования | Трудозатратно, высок риск забыть отключить заказы |