Диагностика проблемы с автоматическим изменением статуса заказа в WooCommerce
Частая задача — автоматизировать смену статуса заказа в WooCommerce по определённым условиям (например, после успешной оплаты, поступления товара на склад или завершения доставки). Но бывает, что предусмотренный код для смены статуса не срабатывает, либо изменения не отображаются в админке. Причины обычно связаны с неправильным хуком, конфликтами плагинов или кешированием.
Как проверить текущий статус и логику обработки
- Убедитесь, что используемый хук корректен. Для смены статуса обычно применяют
woocommerce_order_status_changedилиwoocommerce_payment_complete. - Проверьте, что код запускается — добавьте логирование (например, в
wp-content/debug.log) или вывод в error_log. - Отключите кеширование (например, плагин кеша или серверный кеш), чтобы исключить задержки обновления.
- Убедитесь, что нет конфликтов с другими плагинами, отключив их поочерёдно.
Пошаговое решение: автоматическая смена статуса заказа
Рассмотрим пример, как автоматически менять статус заказа на «выполнен» при выполнении определённого условия — например, если сумма заказа превышает 1000 руб.
add_action('woocommerce_thankyou', 'auto_complete_large_orders', 20, 1);
function auto_complete_large_orders( $order_id ) {
if ( ! $order_id ) return;
$order = wc_get_order( $order_id );
if ( ! $order ) return;
// Условие: сумма больше 1000 руб.
if ( $order->get_total() > 1000 && $order->get_status() !== 'completed' ) {
$order->update_status('completed', 'Автоматическое завершение заказа, сумма больше 1000');
}
}
Код добавляет обработчик на событие woocommerce_thankyou, которое срабатывает после оформления заказа. Функция проверяет сумму и меняет статус на «completed» при необходимости.
Разбор кода
wc_get_order( $order_id )— получение объекта заказа.get_total()— получение итоговой суммы.update_status('completed')— смена статуса заказа.
Альтернативный вариант — смена статуса по хуку оплаты
add_action('woocommerce_payment_complete', 'auto_complete_order_on_payment');
function auto_complete_order_on_payment( $order_id ) {
$order = wc_get_order( $order_id );
if ( $order->get_total() > 1000 && $order->get_status() !== 'completed' ) {
$order->update_status('completed', 'Автоматический переход в выполнен после оплаты');
}
}
Проверка результата после внедрения
Чтобы убедиться, что код работает:
- Оформите тестовый заказ с суммой, превышающей 1000 руб.
- После оформления проверьте статус заказа в админке WooCommerce — он должен автоматически измениться на «Выполнен».
- Если не сработало, включите
WP_DEBUGи проверьтеdebug.logна наличие ошибок. - Проверьте, не перекрывается ли статус другими плагинами или темой.
- Для логирования добавьте в функцию
error_log('Order #'. $order_id .' status changed');и посмотрите логи сервера.
Частые ошибки и как их исправить
- Хук не срабатывает: возможно, выбран неправильный хук. Для смены статуса лучше использовать
woocommerce_payment_completeилиwoocommerce_thankyou. - Статус не меняется, но функция вызывается: проверьте, не блокирует ли смену статуса другой код или плагин.
- Кеширование мешает обновлению статуса: отключите кеширование страниц и объектное кеширование, особенно если используете WP Rocket, LiteSpeed Cache и др.
- Правильный статус: используйте статус из списка WooCommerce (
pending,processing,completed,on-hold,cancelled,refunded,failed), иначе ничего не изменится. - Отсутствие прав на изменение заказа: убедитесь, что код выполняется в контексте с правами администратора (обычно при хуках это гарантировано).
Практические советы по безопасности и производительности
- Не используйте тяжелые операции внутри обработчиков смены статуса — это может замедлить процесс оформления заказа.
- Всегда проверяйте наличие объекта заказа перед вызовом методов (как в примерах выше).
- Логируйте ошибки и ключевые события для быстрого отлова проблем в проде.
- Если требуется сложная логика — выносите её в отдельные классы или сервисы, чтобы код был читаемым и поддерживаемым.
- Для масштабных проектов лучше использовать очередь задач (например, WP-Cron или external queue) для асинхронной обработки изменений.
Сравнение вариантов реализации автоматической смены статуса заказа
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Хук woocommerce_thankyou | Срабатывает после оформления заказа, прост в использовании | Не подходит, если оплата происходит позже (например, при офлайн оплате) | Для онлайн-платежей сразу после оформления |
Хук woocommerce_payment_complete | Срабатывает при подтверждении оплаты, точный момент для смены статуса | Не срабатывает для заказов без оплаты | Для заказов с онлайн-оплатой |
| Ручная смена через CRON | Позволяет обрабатывать заказы пакетно, гибко | Сложнее в реализации, задержка обработки | Для сложной логики и массового обновления заказов |