Диагностика задачи: зачем нужно автоматическое изменение статусов
В стандартном WooCommerce смена статуса заказа происходит вручную или при определённых триггерах, например, при оплате. Иногда нужна более гибкая автоматизация — например, перевод заказа в статус «Выполнен» после отправки товара, или перевод в «Отменён» при определённых условиях (например, если прошло слишком много времени без оплаты).
Если вы хотите управлять статусами заказов автоматически, исходя из кастомных правил, без постоянного ручного контроля, нужно реализовать код, который будет отслеживать нужные события и менять статус.
Как определить, что автоматизация статусов актуальна
- Вы получаете много заказов с одинаковыми условиями обработки.
- Стандартные триггеры WooCommerce не покрывают все ваши сценарии.
- Хотите уменьшить количество ошибок оператора и ускорить обработку заказов.
Пошаговое решение: программное изменение статуса заказа
1. Используем хук для проверки условий
Например, меняем статус на «completed», если заказ оплачен и прошло 3 дня с момента оплаты (имитируем автоматическую отправку товара).
add_action('woocommerce_order_status_processing', 'auto_complete_order_after_days', 20, 1);
function auto_complete_order_after_days($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$paid_date = $order->get_date_paid();
if (!$paid_date) return;
$now = new DateTime('now', new DateTimeZone('UTC'));
$paid_date->setTimezone(new DateTimeZone('UTC'));
$interval = $paid_date->diff($now)->days;
if ($interval >= 3) {
$order->update_status('completed', 'Автоматическое завершение заказа через 3 дня после оплаты');
}
}2. Создаем проверку для отмены неоплаченных заказов
Пример: отменяем заказы, которые остаются в статусе «on-hold» более 7 дней.
add_action('woocommerce_order_status_on-hold', 'auto_cancel_unpaid_orders', 20, 1);
function auto_cancel_unpaid_orders($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$created_date = $order->get_date_created();
if (!$created_date) return;
$now = new DateTime('now', new DateTimeZone('UTC'));
$created_date->setTimezone(new DateTimeZone('UTC'));
$interval = $created_date->diff($now)->days;
if ($interval >= 7) {
$order->update_status('cancelled', 'Автоматическая отмена неоплаченного заказа через 7 дней');
}
}3. Запускаем проверку с помощью WP-Cron
Чтобы код срабатывал автоматически, нужно добавить WP-Cron задачу, которая будет запускать эти проверки раз в сутки.
add_action('wp', 'register_daily_order_status_check');
function register_daily_order_status_check() {
if (!wp_next_scheduled('daily_order_status_update')) {
wp_schedule_event(time(), 'daily', 'daily_order_status_update');
}
}
add_action('daily_order_status_update', 'process_order_status_updates');
function process_order_status_updates() {
$args = [
'limit' => -1,
'status' => ['processing', 'on-hold'],
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
if ($order->get_status() === 'processing') {
auto_complete_order_after_days($order->get_id());
}
if ($order->get_status() === 'on-hold') {
auto_cancel_unpaid_orders($order->get_id());
}
}
}Проверка результата после внедрения
- Создайте тестовый заказ и установите статус «processing» с датой оплаты 3 и более дней назад — статус должен автоматически смениться на «completed» после запуска WP-Cron.
- Создайте заказ в статусе «on-hold» с датой создания более 7 дней назад — он должен автоматически перейти в статус «cancelled».
- Проверьте журнал WooCommerce или используйте плагин «WP Crontrol» для управления и просмотра запланированных задач.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически. Часто бывает на локальных серверах или при низкой посещаемости сайта. Решение: настроить системный cron для вызова
wp-cron.phpили использовать плагин для имитации запуска. - Неправильные временные зоны. Проверяйте, что сравниваете даты в одной временной зоне (обычно UTC). Иначе интервал будет считаться некорректно.
- Отсутствие проверки на существование объекта заказа. Добавьте проверки
if (!$order) return;, чтобы избежать ошибок при удалении или некорректных ID.
Практические советы по безопасности и производительности
- Не обрабатывайте заказы массово в одном запросе, если их много — используйте пагинацию или лимит.
- Для отладки включайте WP_DEBUG и ведите логи ошибок, чтобы контролировать сбои.
- Не меняйте статус заказов без явного условия, чтобы не нарушить логику работы магазина и учёт заказов.
Сравнение подходов: плагин против кастомного кода
| Критерий | Плагин (например, AutomateWoo) | Кастомный код | Компромисс |
|---|---|---|---|
| Гибкость | Высокая, но ограничена функционалом плагина | Абсолютная, под любые условия | Код сложнее поддерживать |
| Производительность | Может добавлять нагрузку | Оптимизированный код — меньше нагрузки | Требует навыков разработки |
| Стоимость | Платные лицензии | Бесплатно, если умеете писать код | Время на разработку |
| Поддержка | Профессиональная поддержка | Самостоятельное сопровождение | Зависит от навыков |