Почему важно автоматизировать смену статуса заказов в WooCommerce
В интернет-магазинах на WooCommerce часто возникает задача автоматически переводить заказы из одного статуса в другой после определённого времени. Например, переводить заказ из «В ожидании» в «Отменён» спустя 24 часа, если оплата не поступила, или менять статус «В обработке» на «Завершён» после доставки. Автоматизация таких процессов снижает ручной труд и помогает поддерживать актуальность статусов.
Диагностика: как понять, что автоматизация нужна и что не работает
Если вы заметили, что заказы долго остаются в статусе «Ожидает оплаты» или «В обработке», хотя по логике бизнес-процесса они должны автоматически сменить статус, значит автоматизация отсутствует или сломана.
- Проверьте, сколько заказов в WooCommerce находятся в одном статусе более 24 часов.
- Осмотрите логи сервера и WooCommerce на предмет ошибок при попытке смены статуса.
- Убедитесь, что WP-Cron работает корректно (будет подробно описано ниже).
Пошаговое решение: автоматическая смена статуса заказов через WP-Cron
1. Создаём функцию смены статуса
Добавьте следующий код в файл functions.php вашей темы или в свой кастомный плагин:
function wplog_change_order_status_by_time() {
$args = array(
'limit' => -1,
'status' => 'pending', // Статус, который нужно изменить
'date_created' => '<' . ( new WC_DateTime( '-24 hours' ) )->format( 'Y-m-d H:i:s' ),
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->update_status( 'cancelled', 'Автоматическая отмена заказа после 24 часов ожидания оплаты.' );
}
}2. Регистрируем крон-задачу
Добавляем событие для запуска функции раз в час:
function wplog_register_cron_event() {
if ( ! wp_next_scheduled( 'wplog_hourly_order_status_update' ) ) {
wp_schedule_event( time(), 'hourly', 'wplog_hourly_order_status_update' );
}
}
add_action( 'wp', 'wplog_register_cron_event' );
add_action( 'wplog_hourly_order_status_update', 'wplog_change_order_status_by_time' );3. Проверяем выполнение WP-Cron
WP-Cron зависит от посещений сайта. Для сайтов с низкой посещаемостью лучше настроить системный cron:
# Пример команды для системного cron (Linux)
curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1Настройте эту команду в crontab на сервере, чтобы запускать её, например, каждые 15 минут.
Проверка результата после внедрения
- Создайте тестовый заказ со статусом «Ожидает оплаты» и установите дату создания более 24 часов назад (можно сделать через админку или базу данных).
- Запустите вручную
wplog_change_order_status_by_time()через консоль WP-CLI:wp eval 'wplog_change_order_status_by_time();' - Проверьте, что статус заказа изменился на «Отменён» и в комментариях заказа появилась запись с сообщением об автоматической смене.
- Следите за логами ошибок и убедитесь, что ошибок нет.
Частые ошибки и как их исправить
- WP-Cron не срабатывает: проверьте, что сайт получает трафик, иначе WP-Cron не запустится. Для надёжности настройте системный cron.
- Заказы не меняют статус: проверьте правильность статусов в коде (например,
pendingиcancelledдолжны быть валидными статусами WooCommerce). Убедитесь, что функция вызывается и нет ошибок PHP. - Проблемы с датой создания: при фильтрации заказов по дате убедитесь, что формат даты совпадает с тем, что ожидает WooCommerce, и что дата действительно старше указанного времени.
Практические советы по безопасности и производительности
- Обрабатывайте заказы пакетами, если у вас очень большое количество заказов, чтобы избежать таймаута или переполнения памяти:
function wplog_change_order_status_by_time() {
$paged = 1;
do {
$args = array(
'limit' => 20,
'page' => $paged,
'status' => 'pending',
'date_created' => '<' . ( new WC_DateTime( '-24 hours' ) )->format( 'Y-m-d H:i:s' ),
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->update_status( 'cancelled', 'Автоматическая отмена заказа после 24 часов ожидания оплаты.' );
}
$paged++;
} while ( count( $orders ) > 0 );
}- Проверяйте нагрузку сервера и время выполнения скрипта, при необходимости добавьте логирование для отладки.
- При использовании системного cron убедитесь, что он запускается от пользователя с правами на чтение сайта и не конфликтует с другими задачами.
Сравнение вариантов реализации
| Способ | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| WP-Cron | Просто настроить, не требует доступа к серверу | Зависит от посещаемости, возможны задержки | Подключить системный cron для надёжности |
| Системный cron | Стабильный запуск по расписанию | Требуется доступ к серверу и навыки настройки | Использовать вместе с WP-Cron |
| Плагины для автоматизации | Интерфейс и дополнительные функции без кода | Избыточность, нагрузка, зависимость от сторонних решений | Использовать для сложных сценариев, иначе писать код |