Проблема: необходимость автоматически менять статус заказа после отправки
В WooCommerce часто требуется, чтобы после того как заказ был отправлен (например, по API службы доставки или вручную), его статус автоматически менялся на «Выполнен» или другой желаемый. Без этого менеджерам приходится менять статусы вручную, что увеличивает вероятность ошибок и затягивает обработку заказов.
Диагностика: как понять, что автоматическое обновление статуса не работает
- Заказы остаются в статусе «Обработка» после отправки.
- Нет автоматического перехода в «Выполнен» или другой статус по событию отправки.
- Отсутствуют триггеры в системе, реагирующие на изменения в заказах.
Часто причина в том, что службы доставки не интегрированы с WooCommerce или отсутствует кастомный код, который меняет статус после подтверждения отправки.
Пошаговое решение: автоматическое обновление статуса заказа
1. Определяем событие, которое будет триггером
Например, если вы используете плагин или API службы доставки, можно в момент установки мета-поля с номером отслеживания менять статус заказа.
2. Добавляем пользовательский код в functions.php или в кастомный плагин
add_action('woocommerce_order_status_processing', 'auto_complete_order_after_shipping', 20, 1);
function auto_complete_order_after_shipping($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
// Проверяем наличие трек-номера
$tracking_number = $order->get_meta('_tracking_number');
if ($tracking_number) {
// Меняем статус на completed
$order->update_status('completed', 'Заказ автоматически завершён после отправки.');
}
}В этом примере, если у заказа есть мета _tracking_number, статус меняется с processing на completed.
3. Автоматическое добавление трек-номера
Если вы получаете данные от службы доставки по API, можно добавить трек-номер программно:
$order = wc_get_order($order_id);
$order->update_meta_data('_tracking_number', '123456789');
$order->save();Проверка результата
- Создайте тестовый заказ и назначьте ему статус
processing. - Добавьте мета-поле с трек-номером вручную или через код.
- Обновите заказ и убедитесь, что он автоматически получил статус
completed. - Проверьте историю изменений заказа в админке WooCommerce — должно появиться системное сообщение об изменении статуса.
Частые ошибки и их исправление
- Код не срабатывает: проверьте, что хук
woocommerce_order_status_processingподходит под вашу логику — возможно, нужно использовать другой хук, например,woocommerce_order_status_on-holdилиwoocommerce_order_status_completed. - Мета-поле не сохраняется: убедитесь, что используете правильный ключ и что поле действительно добавляется заказу.
- Изменение статуса вызывает бесконечный цикл: не вызывайте update_status внутри хука, который срабатывает при смене того же статуса без условий.
Практические советы по безопасности и производительности
- Используйте проверку прав доступа, если код будет вызываться из публичных API или AJAX.
- Минимизируйте количество запросов к базе — кэшируйте данные, если работаете с API доставки.
- Логируйте изменения статусов в отдельный файл для последующего аудита (можно использовать
error_logили специализированные плагины логирования).
Сравнение способов реализации автоматического обновления статусов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Кастомный код через хуки | Использование PHP-кода в functions.php или плагине | Гибкость, полный контроль, без дополнительных плагинов | Требует навыков программирования, возможны ошибки при реализации |
| Плагины отслеживания доставки | Готовые решения для интеграции служб доставки и смены статусов | Простота установки, поддержка популярных служб | Часто платные, ограниченная кастомизация |
| Ручное обновление с помощью админки | Менеджеры меняют статус вручную после отправки | Простота, не требует кода | Высокая вероятность ошибок, затратность времени |