Диагностика задачи: зачем нужно автоматическое изменение статусов заказов
В WooCommerce стандартные статусы заказов не всегда покрывают все бизнес-сценарии. Например, необходимо автоматически переводить заказ в статус "выполнен" через определённое время после оплаты или менять статус на "ожидает отправки" при наличии определённых товаров в заказе. Автоматизация таких процессов снижает ручной труд и повышает точность управления заказами.
Основные хуки для автоматизации изменения статусов заказов
Для автоматического изменения статусов в WooCommerce используйте следующие хуки:
woocommerce_order_status_changed— срабатывает при изменении статуса заказа;woocommerce_payment_complete— срабатывает после успешной оплаты заказа;woocommerce_order_status_completed— при переводе заказа в статус "завершён".
В зависимости от задачи выбирайте нужный хук.
Пошаговое решение: пример автоматического перевода заказа в статус "завершён" через 7 дней после оплаты
Этот пример показывает, как с помощью WP-Cron автоматически менять статус заказа спустя неделю после оплаты:
add_action('woocommerce_payment_complete', 'schedule_order_complete_7_days_later');
function schedule_order_complete_7_days_later($order_id) {
if (!$order_id) return;
wp_schedule_single_event(time() + 7 * DAY_IN_SECONDS, 'auto_complete_order', array($order_id));
}
add_action('auto_complete_order', 'auto_complete_order_callback');
function auto_complete_order_callback($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
// Проверяем, что заказ ещё не завершён
if ($order->get_status() !== 'completed') {
$order->update_status('completed', 'Статус изменён автоматически через 7 дней после оплаты');
}
}Объяснение:
- При оплате заказа планируем событие с задержкой 7 дней;
- При наступлении времени проверяем статус заказа и меняем его, если он ещё не завершён.
Автоматическое изменение статуса для заказов с определёнными товарами
Иногда нужно менять статус заказа, если в нём есть конкретные товары. Например, при наличии товара с ID 123 переводить заказ в статус "ожидает отправки":
add_action('woocommerce_payment_complete', 'set_pending_shipping_if_specific_product');
function set_pending_shipping_if_specific_product($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$target_product_id = 123;
$has_target_product = false;
foreach ($order->get_items() as $item) {
if ($item->get_product_id() == $target_product_id) {
$has_target_product = true;
break;
}
}
if ($has_target_product) {
$order->update_status('on-hold', 'Автоматический статус: ожидает отправки, так как в заказе есть товар ID 123');
}
}Проверка результата после внедрения
1. Создайте тестовый заказ с оплатой, который подходит под условия (например, с товаром ID 123).
2. В админке проверьте, что статус изменился автоматически (например, через 7 дней или сразу после оплаты в зависимости от логики).
3. Для отладки используйте плагин WP Crontrol — он поможет просмотреть и запускать отложенные задачи.
4. Логи можно добавить через error_log или использовать плагины типа Query Monitor.
Частые ошибки и как их исправить
- Не срабатывает запланированное событие WP-Cron: убедитесь, что на сайте посещения есть (WP-Cron по умолчанию запускается при заходе на сайт). Для сайтов с малым трафиком рекомендуем настроить системный cron на сервере.
- Статус не меняется: проверьте, что вы используете правильные slug статусов (например,
completed,on-hold), а не человекочитаемые названия. - Функция вызывается слишком часто: добавляйте проверки, чтобы не назначать одно и то же событие повторно для одного заказа.
- Отсутствие прав у пользователя для изменения статуса: код, выполняющий смену статуса, должен запускаться с достаточными правами (чаще всего в контексте администратора или сервера).
Практические советы по производительности и безопасности
- Не планируйте слишком много событий для каждого заказа — это может замедлить сайт. Оптимизируйте логику, объединяя задачи.
- Используйте транзиенты или мета-данные заказов для хранения промежуточного состояния, чтобы избежать повторной обработки.
- Не выводите отладочную информацию на публичной части сайта.
- Проверяйте корректность данных заказа перед изменением статуса, чтобы избежать ошибок.
Сравнение способов автоматизации изменения статусов заказов
| Способ | Преимущества | Недостатки | Пример |
|---|---|---|---|
| WP-Cron с отложенными задачами | Гибко, можно ставить задержки, легко интегрировать с хуками WooCommerce | Зависит от посещаемости сайта, возможны задержки | Пример с 7 днями ожидания (см. выше) |
| Хуки оплаты и статусов | Мгновенное реагирование, простота | Не подходит для отложенных задач | Изменение статуса сразу после оплаты при наличии товара |
| Плагины автоматизации (например, WP All Import с cron) | Готовые решения с интерфейсом | Меньше гибкости, возможно нагромождение | Зависит от конкретного плагина |