Диагностика задачи: зачем менять статус заказа автоматически
В WooCommerce часто возникает необходимость автоматически менять статус заказа без вмешательства администратора. Это актуально, например, для отмены неоплаченных заказов по таймауту, перевода статуса в "выполнен" после отправки товара или для автоматической смены статуса при получении подтверждения от внешней системы оплаты.
Проверка текущей логики статусов поможет понять, где именно необходима автоматизация. Для этого зайдите в WooCommerce > Заказы и изучите логику переходов статусов в вашей бизнес-модели.
Какие хуки WooCommerce подходят для изменения статуса заказа
Основные хуки для управления статусами заказов:
woocommerce_order_status_pending— срабатывает при смене статуса на "в ожидании";woocommerce_order_status_completed— при смене на "выполнен";woocommerce_order_status_cancelled— при отмене заказа;woocommerce_order_status_changed— общий хук для всех изменений статусов;woocommerce_order_status_{old_status}_to_{new_status}— хук для конкретного перехода.
Для автоматического изменения статуса по таймауту полезно использовать wp_cron или внешние cron-задачи, вызывающие пользовательскую функцию с логикой изменения.
Пошаговое решение: пример автоматического изменения статуса неоплаченного заказа через 1 час
1. Добавляем cron-задачу для проверки заказов
add_action('wp', function() {
if (!wp_next_scheduled('wc_auto_cancel_unpaid_orders')) {
wp_schedule_event(time(), 'hourly', 'wc_auto_cancel_unpaid_orders');
}
});2. Пишем функцию для отмены неоплаченных заказов старше 1 часа
add_action('wc_auto_cancel_unpaid_orders', function() {
$args = [
'limit' => -1,
'status' => ['pending', 'on-hold'],
'date_created' => '<' . (time() - HOUR_IN_SECONDS),
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->update_status('cancelled', 'Order automatically cancelled due to payment timeout.');
}
});3. Проверяем работу с помощью журнала заказов
Перейдите в WooCommerce > Заказы, отфильтруйте по статусу "отменён" и убедитесь, что заказы с датой создания более часа назад и статусом "в ожидании" или "на удержании" изменились.
Проверка результата после внедрения
- Создайте тестовый заказ с любым способом оплаты, который переводит заказ в статус
pendingилиon-hold. - Измените дату создания заказа в базе данных (если нужно, для ускорения теста) или подождите час.
- Обновите страницу заказов и проверьте, что статус автоматически сменился на
cancelled. - Посмотрите, что в комментариях заказа появилась запись о причине отмены.
Частые ошибки при автоматическом изменении статусов заказов
- Отсутствие cron-задачи: если WordPress cron не запускается (например, из-за низкой посещаемости), задача не выполнится. Решение: настроить системный cron для вызова
wp-cron.php. - Неправильные параметры запроса заказов: Например, неверное указание даты или статусов в
wc_get_ordersприведет к пустому результату. Пользуйтесь отладкой и var_dump. - Конфликты с другими плагинами: Некоторые плагины могут переопределять логику смены статусов. Проверяйте совместимость.
Практические советы по безопасности и производительности
- Не запускайте тяжелые запросы без лимитов: используйте пагинацию или ограничение количества обрабатываемых заказов за один запуск.
- Добавьте проверку nonce и прав доступа, если функция вызывается через AJAX или REST API.
- Логируйте изменения статусов в отдельный файл или используйте стандартный журнал WooCommerce для последующего аудита.
- Для больших магазинов предпочтительно использовать системный cron вместо wp_cron для стабильности.
Сравнение подходов для автоматической смены статусов
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP Cron | Простая реализация внутри WordPress, не требует внешних настроек | Зависит от посещаемости сайта, может запускаться с задержкой |
| Системный Cron | Точная и стабильная работа по расписанию | Требует доступа к серверу и настройки |
| Вебхуки от платежных систем | Моментальная реакция на события оплаты | Нужна интеграция с внешними системами и обработка ошибок |