Проблема: необходимость автоматического обновления статуса заказа при просрочке оплаты
В WooCommerce по умолчанию заказы остаются в статусе "Ожидает оплаты" неопределённо долго, если покупатель не завершил оплату. Это создаёт нагрузку на админку и мешает аналитике. Частая задача — автоматически переводить неоплаченные заказы в статус "Отменён" через заданное время.
Как диагностировать проблему
- Проверьте, есть ли в базе неоплаченные заказы с датой создания более X дней назад.
- Убедитесь, что нет плагинов, которые уже управляют автоматическим изменением статусов.
- Проверьте, что не настроена автоматическая очистка неоплаченных заказов (например, через WooCommerce настройки).
Пошаговое решение: автоматическое изменение статуса заказов через крон
1. Добавляем функцию для смены статусов
function wpcourse_auto_cancel_unpaid_orders() {
$days_limit = 3; // количество дней до отмены заказа
$date_limit = strtotime("-" . $days_limit . " days");
$args = array(
'limit' => -1,
'status' => 'pending', // статус неоплаченных заказов
'date_created' => '<' . date('Y-m-d H:i:s', $date_limit),
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->update_status('cancelled', 'Автоматическая отмена заказа по истечении срока оплаты.');
}
}2. Регистрируем крон-задачу
add_action('wpcourse_daily_order_check', 'wpcourse_auto_cancel_unpaid_orders');
if ( ! wp_next_scheduled( 'wpcourse_daily_order_check' ) ) {
wp_schedule_event( time(), 'daily', 'wpcourse_daily_order_check' );
}3. Добавляем очистку крон-задачи при деактивации темы или плагина
function wpcourse_deactivate_cron() {
$timestamp = wp_next_scheduled( 'wpcourse_daily_order_check' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpcourse_daily_order_check' );
}
}
register_deactivation_hook( __FILE__, 'wpcourse_deactivate_cron' );Как проверить, что решение работает
- Создайте тестовый заказ со статусом "Ожидает оплаты" с датой создания более 3 дней назад. Можно вручную изменить дату заказа в базе или использовать тестовый плагин.
- Выполните вручную крон-задачу через WP-CLI:
wp cron event run wpcourse_daily_order_check - Проверьте, что статус заказа изменился на "Отменён" и в комментариях заказа появилась заметка об автоматической отмене.
- Настройте логи или уведомления для контроля работы автоматизации.
Частые ошибки и как их исправить
- Крон-задача не запускается: проверьте, что на сайте включён WP-Cron и нет проблем с его запуском. Для отладки используйте плагин WP Crontrol.
- Функция не находит заказы: проверьте правильность параметров
wc_get_orders(), особенно условие по дате. Для сложных условий можно использовать WP_Query напрямую. - Статус не меняется: убедитесь, что функция вызывается, и нет конфликтов с другими плагинами, блокирующими изменение статуса.
Практические советы по производительности и безопасности
- Ограничьте количество обрабатываемых заказов за один запуск, если их слишком много. Например, используйте параметр
limit => 20и в следующий запуск обрабатывайте следующие. - Не запускайте задачу чаще, чем раз в сутки, чтобы не перегружать базу.
- Записывайте результаты работы в лог-файл для мониторинга и выявления сбоев.
- Не используйте слишком короткие сроки отмены, чтобы не потерять клиентов, которые оплачивают с задержкой.
Сравнение способов автоматизации отмены заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php + WP-Cron | Полный контроль, бесплатно, легко адаптировать | Требуется базовые навыки программирования, зависит от WP-Cron |
| Плагин автоматической отмены заказов | Простота установки, готовый функционал | Может быть избыточным, нагрузка, зависит от разработчика |
| Ручное изменение статусов | Максимальная гибкость | Трудозатратно, ошибки, нет автоматизации |