Диагностика задачи: зачем нужно автоматическое изменение статуса заказа
На крупных WooCommerce-магазинах нередко требуется менять статус заказов автоматически: например, переводить оплаченные заказы в статус "выполнен" через несколько дней после оплаты, если товар отгружен, или закрывать заказы, которые долго не обрабатываются. Ручное управление становится неудобным и подвержено ошибкам.
Типичные признаки необходимости автоматизации:
- Много заказов со статусом "обрабатывается" или "выполнен", которые не меняются вовремя.
- Задержки в отправке уведомлений покупателям из-за неподходящего статуса.
- Требование бизнес-логики к статусам заказов с определённой периодичностью.
Пошаговое решение: как настроить автоматическое изменение статуса заказов
1. Создание WP-Cron задачи для периодической проверки заказов
Для запуска автоматического изменения статуса создадим крон-задачу, которая будет запускаться, например, каждый час.
add_action('wp', function() {
if (!wp_next_scheduled('auto_change_order_status_hourly')) {
wp_schedule_event(time(), 'hourly', 'auto_change_order_status_hourly');
}
});2. Создание функции, которая будет менять статусы заказов
В функции проверяем заказы со статусом processing, дата которых старше заданного порога, и меняем их статус на completed.
add_action('auto_change_order_status_hourly', function() {
$args = [
'limit' => -1,
'status' => 'processing',
'date_modified' => '<' . (new WC_DateTime())->modify('-3 days')->format('Y-m-d H:i:s'),
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->update_status('completed', 'Автоматическое обновление статуса заказа спустя 3 дня.');
}
});В данном примере мы меняем статус заказов, находящихся в обработке более 3 дней.
Проверка результата после внедрения
Чтобы проверить, что автоматическое изменение статуса работает:
- Создайте тестовый заказ со статусом
processingи измените дату последнего обновления заказа в базе (например, через phpMyAdmin), установив её более чем на 3 дня назад. - Подождите, пока wp-cron сработает (можно принудительно вызвать
wp cron event run --due-nowпри наличии WP-CLI). - Проверьте, что статус заказа изменился на
completedи в примечаниях появился комментарий от скрипта.
Частые ошибки и как их исправить
- WP-Cron не срабатывает регулярно: по умолчанию WP-Cron запускается при заходе пользователей на сайт. Для надежности настройте системный cron на сервере, который вызывает
wget https://ваш-сайт.ru/wp-cron.php?doing_wp_cronкаждые 15 минут. - Фильтр по дате не срабатывает: В параметре
date_modifiedнельзя использовать операторы напрямую. Решение — использовать класс WC_Order_Query с параметромdate_modifiedв формате массива с ключом'before':
$args = [
'limit' => -1,
'status' => 'processing',
'date_modified' => [
'before' => (new WC_DateTime())->modify('-3 days')->format('Y-m-d H:i:s'),
],
];
$orders = wc_get_orders($args);- Заказы не меняют статус из-за прав доступа: Убедитесь, что скрипт запускается с правами администратора (что по умолчанию верно для WP-Cron).
- Много заказов, скрипт тормозит сайт: Ограничьте количество заказов в одном запуске, например
'limit' => 20, и используйте опцию повторного запуска.
Практические советы по безопасности и производительности
- WP-Cron может не срабатывать на слабых хостингах — настройте системный cron для стабильной работы.
- Не запускайте обработку всех заказов за один раз — разбивайте на пачки, чтобы избежать превышения лимитов памяти и времени выполнения.
- Логируйте изменения статусов в отдельный файл или используйте сторонние сервисы мониторинга, чтобы отслеживать работу автоматизации.
- Проверьте, что ваш код не конфликтует с плагинами, которые также могут менять статусы заказов (например, автоматизация от сторонних плагинов). В случае конфликта — используйте приоритеты хуков или отключайте дублирующие функции.
Сравнение вариантов реализации автоматического изменения статуса заказов
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| WP-Cron с PHP-кодом | Гибкость, полное управление процессом, не требует сторонних плагинов | Зависит от посещаемости сайта, нагрузка при большом числе заказов | Средние и крупные проекты с разработчиками |
| Плагины автоматизации (например, AutomateWoo) | Простота настройки, поддержка бизнес-логики без кода | Платные, могут нагружать сайт, ограничены функционалом | Малый бизнес и маркетологи без навыков программирования |
| Внешние скрипты и вебхуки | Максимальная масштабируемость, интеграция с CRM и ERP | Сложность настройки, требуется внешний сервер | Большие проекты с интеграциями |