Диагностика задачи: зачем менять статус заказа автоматически
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически менять статус заказа спустя определённое время. Например, переводить заказы из статуса «В обработке» в «Завершено» после доставки, или отменять неоплаченные заказы через 24 часа. Автоматизация этих процессов снижает нагрузку на менеджеров и улучшает точность обработки заказов.
Пошаговое решение: реализация автоматической смены статуса заказов
1. Определяем условия и статус для изменения
Решите, на каких статусах и через какой промежуток времени должна происходить смена. Например:
- Статус
processingменяется наcompletedчерез 3 дня после оплаты. - Статус
pendingменяется наcancelledчерез 24 часа без оплаты.
2. Создаём функцию смены статуса и запускаем её по Cron
Добавим код в functions.php или в собственный плагин.
function wpbloger_auto_update_order_status() {
$args = array(
'limit' => -1,
'status' => array('processing', 'pending'),
'date_modified' => '<' . ( time() - DAY_IN_SECONDS ), // 1 день назад
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$status = $order->get_status();
$modified = $order->get_date_modified();
$modified_timestamp = $modified ? $modified->getTimestamp() : 0;
$now = time();
if ( 'processing' === $status ) {
// Меняем на completed если прошло больше 3 дней
if ( $now - $modified_timestamp >= 3 * DAY_IN_SECONDS ) {
$order->update_status( 'completed', 'Автоматическое завершение заказа через 3 дня.' );
}
} elseif ( 'pending' === $status ) {
// Отменяем, если прошло больше 1 дня
if ( $now - $modified_timestamp >= DAY_IN_SECONDS ) {
$order->update_status( 'cancelled', 'Автоматическая отмена неоплаченного заказа через 1 день.' );
}
}
}
}
// Регистрируем Cron задачу, если ещё не зарегистрирована
if ( ! wp_next_scheduled( 'wpbloger_auto_update_order_status_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wpbloger_auto_update_order_status_hook' );
}
add_action( 'wpbloger_auto_update_order_status_hook', 'wpbloger_auto_update_order_status' );3. Проверка работы крона и исправление проблем
Для проверки Cron задач используйте плагин WP Crontrol. В разделе "Cron Events" найдите wpbloger_auto_update_order_status_hook и вручную запустите её для теста. Проверьте логи заказов, отображается ли добавленная заметка о смене статуса.
Проверка результата после внедрения
- Создайте тестовые заказы с нужными статусами и датами изменения.
- Запустите Cron задачу вручную через WP Crontrol.
- Обновите страницу заказа и убедитесь, что статус изменился, а в примечаниях появился комментарий.
Частые ошибки и как их исправить
- Крон не срабатывает: Проверьте, что на сайте активна WordPress Cron. Если нет, настройте системный cron на сервере.
- Неверные даты: Убедитесь, что дата изменения заказа корректно берётся через
get_date_modified(), а не дата создания. - Неправильные статусы: Используйте статусы WooCommerce, доступные через
wc_get_order_statuses(), и проверяйте текущий статус черезget_status(). - Изменения не сохраняются: Используйте метод
update_status()для корректного обновления статуса заказа.
Практические советы по безопасности и производительности
- Не делайте Cron задачу слишком частой — достаточно запускать раз в час.
- Проверяйте количество обрабатываемых заказов, чтобы не перегружать сервер. При большом каталоге можно обрабатывать по партиям.
- Добавьте логи для отслеживания автоматических изменений, чтобы было проще отследить ошибки.
- Для защиты от неправильных изменений можно добавить проверку прав администратора при ручном запуске.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Использование WP Cron (как в статье) | Простота реализации, не требует сторонних плагинов | Зависит от посещаемости сайта, возможны задержки |
| Настройка системного cron с wp-cli | Надёжность и точность запуска задач | Требует доступа к серверу и командной строке |
| Плагины автоматизации заказов | Интерфейс, дополнительные функции | Дополнительная нагрузка, возможные конфликты |