Диагностика задачи: зачем менять статус заказа автоматически
В стандартном WooCommerce заказ меняет статус вручную или по базовым событиям (оплата, отмена, возврат). Но часто нужно сделать более гибкие автоматические переходы, например, переводить заказ в статус "В обработке" сразу после оплаты, или автоматически закрывать заказ после отправки товара. Если вы столкнулись с необходимостью автоматизации смены статусов, это руководство поможет реализовать её через хуки и WP-Cron.
Как определить событие для автоматической смены статуса
WooCommerce генерирует множество событий – от изменения метаданных заказа до внешних триггеров (например, получение статуса от API службы доставки). Основные подходы:
- Использовать хуки WooCommerce, связанные со статусами заказа:
woocommerce_order_status_changed,woocommerce_payment_completeи т.п. - Добавить пользовательские действия после обновления метаданных заказа или внешних событий.
- Запланировать периодическую проверку заказов с помощью WP-Cron.
Пошаговое решение: пример автоматической смены статуса заказа после оплаты
Рассмотрим классический кейс: автоматически переводить заказ в статус processing сразу после оплаты, если он в статусе on-hold.
add_action('woocommerce_payment_complete', 'auto_change_order_status_after_payment');
function auto_change_order_status_after_payment($order_id) {
if ( ! $order_id ) {
return;
}
$order = wc_get_order($order_id);
if ( $order && $order->has_status('on-hold') ) {
$order->update_status('processing', 'Автоматическое обновление статуса после оплаты');
}
}Этот код добавьте в functions.php вашей темы или в кастомный плагин.
Как использовать WP-Cron для массового обновления статусов
Если нужно, чтобы заказы старше определённого срока автоматически переходили в статус completed, используйте WP-Cron:
add_action('wpdocs_custom_cron_hook', 'auto_complete_old_orders');
function auto_complete_old_orders() {
$args = [
'limit' => -1,
'status' => 'processing',
'date_modified' => '<' . (time() - 7 * DAY_IN_SECONDS),
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->update_status('completed', 'Автоматическое завершение заказа через 7 дней');
}
}
if (!wp_next_scheduled('wpdocs_custom_cron_hook')) {
wp_schedule_event(time(), 'daily', 'wpdocs_custom_cron_hook');
}Проверка результата после внедрения
- Создайте тестовый заказ в статусе
on-holdи проведите оплату через тестовый платёжный шлюз. - Проверьте, изменился ли статус заказа на
processingв админке WooCommerce. - Для WP-Cron – в базе данных
wp_optionsнайдите запись с событиемwpdocs_custom_cron_hook, убедитесь, что оно запланировано. - Выполните вручную функцию или дождитесь запуска cron, затем проверьте заказы старше 7 дней.
Частые ошибки и причины
- Код не срабатывает после оплаты – проверьте, что платёжный шлюз вызывает хук
woocommerce_payment_complete. Некоторые шлюзы используют другие хуки. - WP-Cron не запускается – убедитесь, что на сервере разрешены и работают wp-cron задачи; можно запланировать cron через системный crontab с вызовом WP-Cron.
- Обновление статуса не происходит – проверьте права пользователя, под которым запускается код, и корректность ID заказа.
- Массовое обновление тормозит сайт – оптимизируйте запросы, ограничьте число одновременно обновляемых заказов.
Практические советы по безопасности и производительности
- Добавляйте проверку nonce и прав пользователя, если скрипты вызываются из пользовательского интерфейса.
- Для WP-Cron используйте ограничение выборки заказов по времени и статусу, чтобы не перегружать сервер.
- Логируйте изменения статусов в отдельный файл или в системный лог для отладки без вмешательства пользователя.
- Используйте транзакции базы данных, если обновляете связанные таблицы вручную.
Сравнение подходов автоматической смены статуса
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
Хук woocommerce_payment_complete | Мгновенная реакция, простота | Зависит от платёжного шлюза | Оплата заказа |
| WP-Cron периодический | Массовое обновление, гибкость | Задержка выполнения, зависит от cron | Автоматическое закрытие старых заказов |
| Пользовательские хуки | Гибкость, интеграция с внешними API | Требует дополнительной настройки | События вне WooCommerce |