Диагностика проблемы отсутствия платежа в WooCommerce
В интернет-магазине на WooCommerce часто возникает ситуация, когда покупатель создает заказ, но не завершает оплату. Это приводит к "зависшим" заказам со статусом pending или on-hold. Такие заказы занимают место в базе, мешают аналитике и могут вызвать путаницу в учете.
Типичные признаки проблемы:
- Большое количество заказов со статусом
pendingилиon-holdспустя несколько дней после создания; - Отсутствие перехода в статус
processingилиcompleted; - Отсутствие уведомлений об оплате от платежных систем;
Пошаговое решение: автоматическое изменение статуса при отсутствии оплаты
Цель — автоматически менять статус заказов, которые не были оплачены в течение определенного времени, например 24 часа, на статус cancelled. Это позволяет очистить список активных заказов и улучшить управление магазином.
1. Добавление планировщика задач WP-Cron
Для регулярной проверки нужно добавить событие, которое будет запускаться, например, каждый час.
function wpdemo_activate_order_cleanup_cron() {
if ( ! wp_next_scheduled( 'wpdemo_check_unpaid_orders' ) ) {
wp_schedule_event( time(), 'hourly', 'wpdemo_check_unpaid_orders' );
}
}
add_action( 'wp', 'wpdemo_activate_order_cleanup_cron' );
function wpdemo_deactivate_order_cleanup_cron() {
$timestamp = wp_next_scheduled( 'wpdemo_check_unpaid_orders' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpdemo_check_unpaid_orders' );
}
}
register_deactivation_hook( __FILE__, 'wpdemo_deactivate_order_cleanup_cron' );2. Функция обработки заказов
Основная функция будет находить заказы со статусом pending и датой создания старше 24 часов, меняя их статус на cancelled.
add_action( 'wpdemo_check_unpaid_orders', 'wpdemo_cancel_unpaid_orders' );
function wpdemo_cancel_unpaid_orders() {
$args = array(
'limit' => -1,
'status' => 'pending',
'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->update_status( 'cancelled', 'Автоматическое изменение статуса из-за отсутствия оплаты более 24 часов.' );
}
}Проверка результата после внедрения
Чтобы убедиться, что система работает:
- Создайте тестовый заказ и не завершайте оплату.
- Подождите 1 час (или измените интервал cron для ускоренного теста).
- Проверьте статус заказа в админке WooCommerce — он должен измениться на
cancelled. - Проверьте логи WooCommerce или используйте плагин Debug Bar для контроля вызова хука.
Частые ошибки и как их исправить
- Планировщик WP-Cron не срабатывает: на некоторых хостингах WP-Cron зависит от посещений сайта. Для надежной работы настройте системный cron, либо активируйте плагин WP Crontrol для отладки.
- Неверный параметр даты в запросе заказов: WooCommerce требует формат даты в ISO 8601 для
date_created. В примере выше используется метка времени Unix, что вызовет ошибку. Правильный код для даты:
$date = new DateTime();
$date->modify('-24 hours');
$args['date_created'] = '<' . $date->format('Y-m-d H:i:s');- Заказы не меняют статус: проверьте права пользователя, под которым запускается код, и убедитесь, что нет конфликтов с другими плагинами, блокирующими изменение статуса.
Практические советы по безопасности и производительности
- Не выполняйте запрос на поиск большого количества заказов без ограничения — при большом объеме данных используйте пагинацию или batch-обработку.
- Логируйте изменения статусов в отдельный файл или в системный лог, чтобы отслеживать работу скрипта.
- Ограничьте доступ к коду только для администратора сайта, чтобы предотвратить несанкционированные изменения.
Чек-лист внедрения автоматического изменения статуса заказа
- Добавлен и активирован WP-Cron с регулярным запуском задачи.
- Реализована функция, меняющая статус заказов со статусом
pendingстарше 24 часов. - Проверено правильное форматирование даты для запроса заказов.
- Проверена работоспособность на тестовых заказах.
- Проведена отладка WP-Cron на хостинге (проверка через WP Crontrol или системный cron).
- Внедрена базовая логика для отслеживания изменений в статусах заказов.
Сравнение вариантов реализации: плагин vs кастомный код
| Вариант | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Готовый плагин (например, "WooCommerce Order Status Manager") | Быстрая установка, готовый UI, поддержка разных статусов | Может быть избыточным, нагрузка, ограниченная кастомизация | Для магазинов без разработчиков, быстрый старт |
| Кастомный код (как в статье) | Легкий, точечный, полное управление логикой, минимальная нагрузка | Требует навыков разработки и поддержки | Для опытных разработчиков, специфические бизнес-правила |