Диагностика задачи: зачем автоматизировать изменение статуса заказов
В типичных интернет-магазинах на WooCommerce статус заказа меняется вручную администратором или автоматически в ограниченных случаях (например, после оплаты). Однако при большом объёме заказов или специфических бизнес-процессах требуется гибкая автоматизация смены статусов по заданным условиям — например, по времени, наличию оплаты, статусу доставки и т.п.
Если вы замечаете, что статусы заказов не обновляются вовремя, или хотите разгрузить сотрудников от ручных операций, стоит реализовать автоматическое обновление статусов с помощью хуков и WP-Cron.
Пошаговое решение: как настроить автоматическое обновление статусов заказов
Шаг 1. Определяем условия обновления
Например, переведём заказы со статусом processing в completed через 7 дней после оплаты.
Шаг 2. Создаём функцию для смены статуса
function wpstuff_update_order_status_auto() {
$args = [
'limit' => -1,
'status' => 'processing',
'date_paid' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
if ( $order->has_status( 'processing' ) ) {
$order->update_status( 'completed', 'Автоматическое обновление статуса после 7 дней' );
}
}
}Обратите внимание, что параметр date_paid в wc_get_orders не поддерживается напрямую. Вместо него нужно фильтровать вручную:
function wpstuff_update_order_status_auto() {
$orders = wc_get_orders( [ 'limit' => -1, 'status' => 'processing' ] );
$time_limit = time() - 7 * DAY_IN_SECONDS;
foreach ( $orders as $order ) {
$paid_date = $order->get_date_paid();
if ( $paid_date && $paid_date->getTimestamp() < $time_limit ) {
$order->update_status( 'completed', 'Автоматическое обновление статуса после 7 дней' );
}
}
}Шаг 3. Добавляем задачу в WP-Cron
Чтобы функция выполнялась регулярно, регистрируем кастомное событие и привязываем к нему нашу функцию.
add_action( 'wpstuff_daily_order_status_update', 'wpstuff_update_order_status_auto' );
function wpstuff_schedule_order_status_update() {
if ( ! wp_next_scheduled( 'wpstuff_daily_order_status_update' ) ) {
wp_schedule_event( time(), 'daily', 'wpstuff_daily_order_status_update' );
}
}
add_action( 'wp', 'wpstuff_schedule_order_status_update' );Шаг 4. Очистка при деактивации
function wpstuff_clear_scheduled_order_status_update() {
$timestamp = wp_next_scheduled( 'wpstuff_daily_order_status_update' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpstuff_daily_order_status_update' );
}
}
register_deactivation_hook( __FILE__, 'wpstuff_clear_scheduled_order_status_update' );Проверка результата после внедрения
Чтобы проверить работу автоматизации:
- Создайте тестовый заказ в статусе
processing, у которого дата оплаты была более 7 дней назад (можно вручную изменить в базе или через админку, если позволяет). - Запустите вручную функцию
wpstuff_update_order_status_auto()через консоль WP-CLI или добавьте вызов на время теста. - Проверьте, что статус заказа изменился на
completedи в комментариях к заказу появилась запись об обновлении. - Убедитесь, что задача WP-Cron запускается (можно использовать плагин WP Crontrol для мониторинга).
Частые ошибки и как исправить
- WP-Cron не срабатывает: если сайт не получает посетителей, cron-задачи могут не запускаться. Используйте системный cron или внешние сервисы для вызова
wp-cron.php. - Неверное условие даты оплаты:
wc_get_ordersне фильтрует по дате оплаты напрямую, фильтруйте вручную по$order->get_date_paid(). - Отсутствие прав на обновление: убедитесь, что код выполняется с достаточными правами (обычно в админке или через wp-cli).
- Потенциальная нагрузка: если много заказов, запросы могут быть ресурсоёмкими. Используйте пагинацию и лимиты в выборке.
Практические советы по безопасности и производительности
- Не запускайте WP-Cron чаще одного раза в 15 минут для подобных задач, чтобы не создавать нагрузку.
- Добавьте логирование обновлений в отдельный файл или систему логов для аудита.
- После тестов отключайте ручной вызов функций, чтобы избежать случайных изменений.
- При больших объёмах данных разбивайте обработку на партии с помощью
offsetиlimit.
Сравнение вариантов реализации автоматической смены статусов
| Способ | Плюсы | Минусы |
|---|---|---|
| WP-Cron + кастомный код | Гибкость, полное управление, бесплатно | Зависит от посещаемости сайта, требует программирования |
| Плагины автоматизации (например, AutomateWoo) | Интерфейс, готовые триггеры и действия | Платно, может быть избыточно, нагрузка |
| Внешние cron-задачи + API вызовы | Надёжность, не зависит от трафика | Сложность настройки, требует сервера с cron |