Диагностика задачи: зачем менять статус заказа программно
В стандартном WooCommerce статусы заказов меняются вручную или автоматически в зависимости от оплаты, доставки и других встроенных событий. Но часто требуется изменить статус заказа по своим бизнес-правилам: например, после проверки оплаты через сторонний шлюз, подтверждения складом или по итогам кастомной валидации. Важно понять, что изменение статуса должно происходить без нарушения логики WooCommerce и с правильным обновлением данных.
Как отследить и изменить статус заказа по своему условию
Использование хука для изменения статуса
Для изменения статуса заказа по условию можно использовать хук woocommerce_order_status_changed или написать функцию, которая проверяет условие и меняет статус вручную через метод $order->update_status().
Пример кода, который меняет статус на "completed" если сумма заказа больше 10000 рублей:
add_action('woocommerce_order_status_processing', 'wpmax_change_order_status_if_condition', 10, 1);
function wpmax_change_order_status_if_condition($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Условие: сумма больше 10000
if ($order->get_total() > 10000) {
$order->update_status('completed', 'Статус изменён автоматически по сумме заказа.');
}
}Другой пример: изменение статуса после пользовательской проверки
Если у вас есть внешняя проверка (например, API стороннего сервиса), то можно вызвать изменение статуса из своей функции:
function wpmax_custom_check_and_update_status($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
// Пример проверки через API
$check_result = wpmax_external_api_check($order_id);
if ($check_result === true) {
$order->update_status('completed', 'Заказ подтверждён внешней проверкой.');
} elseif ($check_result === false) {
$order->update_status('cancelled', 'Заказ отменён по результатам проверки.');
}
}Пошаговое решение: как внедрить изменение статуса
- Определите событие или условие, при котором хотите менять статус (например, смена статуса на processing, получение webhook, кастомное действие).
- Напишите функцию, которая по
$order_idполучает объект заказа черезwc_get_order(). - Реализуйте проверку вашего условия (сумма, статус оплаты, внешний API и т.д.).
- Вызовите
$order->update_status('new_status', 'Комментарий к изменению');чтобы поменять статус. - Подключите функцию к подходящему хуку, например
woocommerce_order_status_processingили вызывайте вручную.
Как проверить, что всё работает
- Создайте тестовый заказ с условием, при котором статус должен измениться.
- Просмотрите страницу заказа в админке WooCommerce — должен измениться статус и появиться ваш комментарий в истории.
- Проверьте логи сервера и WooCommerce, если добавляете логирование.
- При необходимости добавьте временные
error_log()для отладки.
Частые ошибки при программном изменении статуса заказа
- Изменение статуса вне контекста заказа: вызов
update_statusбез правильного объекта$orderприведёт к ошибкам. - Циклические изменения: изменение статуса внутри хука, который вызывается при изменении статуса, может привести к бесконечным циклам.
- Игнорирование проверки условий: меняйте статус только если условие действительно выполнено, иначе можно испортить логику заказов.
- Необработанные исключения у внешних API: всегда обрабатывайте ошибки и таймауты при вызове внешних сервисов.
Практические советы по безопасности и производительности
- Не используйте изменение статуса в хуках, которые вызываются слишком часто, чтобы избежать нагрузки.
- Проверяйте права пользователя, если изменение статуса инициируется из пользовательского интерфейса.
- Логируйте изменения статусов для аудита и отладки.
- Ограничьте вызов внешних API, чтобы не блокировать процесс обработки заказа.
Сравнение способов изменения статуса заказа
| Способ | Плюсы | Минусы |
|---|---|---|
| Хук WooCommerce (например, woocommerce_order_status_processing) | Автоматизация, встроенный механизм, прост в подключении | Риск циклов, ограничен событиями WooCommerce |
Вызов update_status() вручную при кастомном событии | Гибкость, можно вызывать в любой момент | Необходимо контролировать вызов и условия |
| Использование сторонних плагинов автоматизации | Меньше кода, готовые решения | Зависимость от плагина, возможные конфликты |