Диагностика проблемы: зачем нужно автоматическое обновление статуса заказа
В стандартном WooCommerce статусы заказов меняются вручную или автоматически по некоторым событиям (например, оплата). Однако в ряде бизнес-сценариев требуется автоматическая смена статуса заказов по истечению определённого времени — например, перевод заказов из статуса «В обработке» в «Отменён» через 3 дня при отсутствии оплаты, или изменение «Выполняется» на «Завершён» спустя 7 дней после отправки.
Без автоматизации такие процессы требуют постоянного ручного контроля, что увеличивает нагрузку и может привести к ошибкам, влияя на пользовательский опыт и отчёты.
Пошаговое решение: как реализовать автоматическое обновление статусов заказов
1. Создаём функцию для обновления статусов заказов по срокам
Используем WP-Cron для запуска проверки заказов и смены статуса по времени.
function wc_auto_update_order_statuses() {
// Получаем заказы в статусе 'processing' старше 3 дней
$args = array(
'limit' => -1,
'status' => 'processing',
'date_created' => '<' . ( time() - 3 * DAY_IN_SECONDS ),
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
$order = wc_get_order( $order_id );
if ( $order ) {
$order->update_status( 'cancelled', 'Автоматическая отмена: заказ не оплачен более 3 дней.' );
}
}
// Аналогично обновим заказы 'completed' старше 7 дней в статус 'archived' (если нужно)
// Реализуйте под ваши задачи
}
2. Регистрируем событие WP-Cron для вызова функции раз в сутки
add_action( 'wp', 'wc_schedule_daily_order_status_update' );
function wc_schedule_daily_order_status_update() {
if ( ! wp_next_scheduled( 'wc_daily_order_status_update' ) ) {
wp_schedule_event( time(), 'daily', 'wc_daily_order_status_update' );
}
}
add_action( 'wc_daily_order_status_update', 'wc_auto_update_order_statuses' );
3. Запускаем задачу вручную при отладке
Для проверки можно вызвать функцию напрямую:
wc_auto_update_order_statuses();Как проверить, что автоматическое обновление работает
- Создайте тестовый заказ со статусом
processing, у которого дата создания более 3 дней назад (можно вручную изменить в базе или через админку с помощью плагина типа WP phpMyAdmin). - Запустите функцию вручную через админ-панель, например, через плагин Code Snippets или временно в functions.php.
- Проверьте, что статус заказа изменился на
cancelledи в истории заказа появилась заметка об автоматическом обновлении. - Если используете WP-Cron, дождитесь срабатывания задачи или запустите wp-cron вручную (например, через WP-CLI
wp cron event run wc_daily_order_status_update).
Частые ошибки и как их исправить
- Заказы не обновляются: проверьте, активен ли WP-Cron, нет ли конфликтов с плагинами, которые могут отключать cron. Для проверки можно воспользоваться плагинами типа WP Crontrol.
- Неверный фильтр даты: аргумент
date_createdвwc_get_ordersдолжен быть в правильном формате. В примере используется timestamp в сравнении с текущим временем, однако WooCommerce ожидает строку в формате ISO 8601. Для исправления замените фильтр наarray('before' => date('Y-m-d H:i:s', strtotime('-3 days'))):
$args = array(
'limit' => -1,
'status' => 'processing',
'date_created' => array(
'before' => date( 'Y-m-d H:i:s', strtotime( '-3 days' ) ),
),
'return' => 'ids',
);
- Изменение статуса не сохраняется: убедитесь, что используете метод
update_status(), а не просто меняете свойство объекта. - Слишком частое срабатывание WP-Cron: функция должна выполняться не чаще раза в сутки, чтобы не нагружать сервер. Используйте
wp_schedule_eventс интерваломdaily.
Практические советы по безопасности и производительности
- Не запускайте обработку всех заказов без лимита на больших магазинах. Используйте пагинацию или ограничьте количество заказов за один запуск (например,
'limit' => 100). - Добавляйте логирование изменений в отдельный лог-файл или в системный лог для отладки и мониторинга.
- Проверяйте права пользователя, если функцию вызываете из админки вручную.
- Размещайте код в кастомном плагине или child-теме, чтобы не потерять изменения при обновлении.
Сравнение вариантов реализации автоматического обновления статусов заказов
| Вариант | Преимущества | Недостатки |
|---|---|---|
| Код на WP-Cron | Гибкость, полное управление, нет зависимостей | Нужно писать и тестировать, возможны ошибки при больших данных |
| Плагины автоматизации | Простота настройки, готовые функции | Могут быть тяжелыми, не всегда подходят под специфичные задачи |
| Внешние CRON-задания (через сервер) | Более надёжное выполнение, не зависит от посещаемости | Требуют доступа к серверу, навыков настройки |