Диагностика задачи: зачем нужна автоматизация изменения статусов заказов
В стандартном WooCommerce статусы заказов меняются вручную или автоматически в рамках базовых сценариев (например, после оплаты). Но часто нужны кастомные автоматические переходы статусов, например, установка статуса «выполнен» через X дней после отправки, или автоматический переход в «отменён» при определённых условиях.
Если вы замечаете, что вручную менять статусы неудобно, или хочется интегрировать статусы с внешними процессами, то автоматизация через хуки и cron — оптимальное решение.
Основные хуки для управления статусами заказов в WooCommerce
Для изменения статуса заказа программно используют метод $order->update_status( $new_status, $note = '', $manual = false ). Чтобы запускать автоматизацию, применяют cron-задачи или хуки, например:
woocommerce_order_status_changed– вызывается при смене статуса заказа.woocommerce_thankyou– срабатывает после оформления заказа, полезно для запуска таймеров.
Пример: перевод заказа в статус «выполнен» через 7 дней после отправки
Предположим, что после смены статуса на «в обработке» нужно запустить отсчёт 7 дней, по окончании которых статус автоматически перейдёт в «выполнен».
add_action('woocommerce_order_status_processing', 'schedule_order_completion');
function schedule_order_completion( $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', 'complete_order_callback');
function complete_order_callback( $order_id ) {
if ( ! $order_id ) return;
$order = wc_get_order( $order_id );
if ( $order && $order->has_status('processing') ) {
$order->update_status('completed', 'Автоматическое завершение заказа через 7 дней после обработки');
}
}Пошаговое решение: создание автоматического изменения статусов по времени
1. Добавление функции для планирования задачи
Используйте хук смены статуса заказа, чтобы запланировать событие в WP-Cron.
2. Создание обработчика для выполнения смены статуса
Обработчик получает ID заказа, проверяет текущий статус и меняет на нужный.
3. Проверка и очистка запланированных задач
Чтобы избежать дублирования, перед планированием можно очистить существующие задачи для этого заказа.
add_action('woocommerce_order_status_processing', 'schedule_order_completion');
function schedule_order_completion( $order_id ) {
if ( ! $order_id ) return;
// Отменяем предыдущие задачи на случай повторного вызова
wp_clear_scheduled_hook('auto_complete_order', array( $order_id ));
wp_schedule_single_event( time() + 7 * DAY_IN_SECONDS, 'auto_complete_order', array( $order_id ) );
}Проверка результата после внедрения
- Создайте тестовый заказ и переведите его в статус «в обработке».
- Проверьте, что в базе WP-Cron появилась запланированная задача
auto_complete_orderс правильным аргументом (ID заказа). - Через 7 дней статус заказа должен автоматически измениться на «выполнен».
- Для тестирования можно временно уменьшить время ожидания в функции
wp_schedule_single_eventдо нескольких минут.
Частые ошибки и как их исправить
- Задача WP-Cron не запускается: убедитесь, что на сайте посетители заходят регулярно, или настройте системный cron для вызова
wp-cron.php. - Несоответствие статусов: проверяйте, что в функции
update_statusпередаётся корректный статус (например, "completed", а не "done"). - Дублирование задач: используйте
wp_clear_scheduled_hookперед планированием, чтобы не создавать несколько одинаковых событий для одного заказа. - Права доступа: убедитесь, что код добавлен в файл темы
functions.phpили в плагин, а не в файл, который не подключается.
Практические советы по безопасности и производительности
- WP-Cron зависит от посещений сайта. Для сайтов с малым трафиком лучше настроить системный cron, чтобы
wp-cron.phpвызывался регулярно. - Не запускайте тяжелые операции в cron-задачах, чтобы не перегружать сервер.
- Проверяйте статус заказа перед сменой, чтобы избежать ошибок и конфликтов.
- Для массовых изменений используйте WP CLI, если автоматизация через крон не подходит.
Сравнительная таблица вариантов автоматизации изменения статусов заказов
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| WP-Cron + PHP код | Гибкость, не требует плагинов, точное управление | Зависит от посещаемости сайта, требует знаний PHP | Код из статьи |
| Плагины автоматизации (например, AutomateWoo) | Простота настройки, UI, готовые шаблоны | Дополнительные расходы, нагрузка на сайт | Настройка через UI |
| Ручное изменение статусов | Простота, контроль | Не масштабируемо, требует времени | Админ-панель WooCommerce |