Диагностика проблемы: зачем нужно автоматическое управление статусами заказов в WooCommerce
В стандартном WooCommerce все заказы создаются со статусом pending или processing и требуют ручного подтверждения или автоматического перехода в следующий статус после оплаты. Часто возникает задача автоматически менять статус заказа на «одобрен» или «отклонен» в зависимости от определённых условий: сумма заказа, наличие определённых товаров, способ оплаты и другие параметры. Это позволяет ускорить обработку, снизить человеческий фактор и автоматизировать бизнес-процессы.
Типичные сценарии автоматизации статусов заказов
- Автоматическое одобрение заказов при оплате определённым способом (например, PayPal подтверждённый)
- Автоматическое отклонение заказов с низкой суммой или с запрещёнными товарами
- Автоматическое изменение статуса для заказов с определёнными пользовательскими полями
Пошаговое решение: как автоматически менять статус заказа по условиям
Рассмотрим пример, когда заказы с суммой больше 5000 рублей переходят в статус completed (одобрены), а заказы с суммой меньше 1000 рублей автоматически отклоняются (статус cancelled).
1. Добавляем код в файл functions.php вашей темы или в отдельный плагин.
add_action('woocommerce_thankyou', 'auto_change_order_status_based_on_amount', 10, 1);
function auto_change_order_status_based_on_amount($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
$total = $order->get_total();
// Проверяем текущий статус, чтобы не менять уже обработанные заказы
$status = $order->get_status();
if ($status !== 'processing' && $status !== 'pending') {
return; // Уже обработан
}
if ($total > 5000) {
$order->update_status('completed', 'Автоматическое одобрение: сумма больше 5000');
} elseif ($total < 1000) {
$order->update_status('cancelled', 'Автоматическое отклонение: сумма меньше 1000');
}
}2. Этот хук woocommerce_thankyou срабатывает после успешного оформления заказа, то есть после оплаты (для платёжных систем, поддерживающих возврат статуса).
Добавление условий по товарам в заказе
Если нужно проверить наличие конкретного товара или категории, добавьте внутри функции проверку товаров:
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
// Проверяем наличие запрещённого товара с ID 123
if ($product_id == 123) {
$order->update_status('cancelled', 'Отклонено: заказ содержит запрещённый товар');
return;
}
}Проверка результата после внедрения
- Оформите тестовый заказ с суммой более 5000 — статус должен автоматически перейти в
completed. - Оформите заказ с суммой менее 1000 — статус должен стать
cancelled. - Проверьте, что заказы с промежуточной суммой не меняют статус автоматически.
- Просмотрите журнал заказов в админке WooCommerce и убедитесь, что комментарии к статусам добавились корректно.
Частые ошибки и как исправить
- Статус не меняется: проверьте, что хук
woocommerce_thankyouдействительно срабатывает для используемого способа оплаты. Для некоторых способов (например, оффлайн) этот хук не вызывается. Можно использоватьwoocommerce_order_status_pending_to_processingили другие хуки смены статуса. - Заказы не обновляются, если уже в статусе
processing: добавьте логику обработки нескольких статусов или используйте другой хук. - Проблемы с кешированием: очистите кеш сайта и браузера, если не видите изменений.
- Конфликты с другими плагинами: временно отключите сторонние расширения, которые могут менять статус заказов.
Практические советы по безопасности и производительности
- Не храните критичные бизнес-правила только в коде — лучше создать отдельное административное меню для управления условиями смены статусов.
- Используйте транзиенты или кэширование, если проверяете сложные условия, чтобы не нагружать БД.
- Всегда проверяйте права пользователя и безопасность данных при добавлении пользовательских условий.
- Для масштабируемых решений рассмотрите создание отдельного плагина с возможностью расширения логики.
Сравнение способов автоматизации статусов заказов
| Способ | Преимущества | Недостатки |
|---|---|---|
Хук woocommerce_thankyou с PHP-кодом |
Простота, гибкость, нет дополнительных плагинов | Зависит от способа оплаты, может не сработать для оффлайн платежей |
| Плагины автоматизации заказов (например, AutomateWoo) | Графический интерфейс, много условий, интеграции | Платные, дополнительная нагрузка на сайт |
| Использование WP-Cron и кастомных задач | Можно ставить задачи по расписанию, не зависит от оплаты | Сложнее в реализации, возможны задержки из-за Cron |