Проблема: необходимость автоматического изменения статусов заказов по времени
В стандартном WooCommerce изменение статусов заказов происходит вручную или по событиям, инициированным пользователем или системой (например, успешная оплата). Однако часто требуется автоматизировать смену статусов заказов по расписанию, например, переводить заказы из статуса "в обработке" в "завершён" спустя определённое время, чтобы снизить нагрузку поддержки и ускорить процессы.
Диагностика задачи: как понять, что автоматизация нужна именно вам
- Много заказов в статусе "в обработке" или "ожидает оплаты", которые долго не меняют статус.
- Ручное обновление статусов занимает много времени и приводит к ошибкам.
- Нужна автоматизация для определенного бизнес-процесса — например, автоматическое закрытие заказов, которые не были оплачены в течение 3 дней.
Пошаговое решение: реализация автоматического изменения статуса заказов по времени
1. Создаем функцию для проверки и обновления статусов заказов
Ниже сниппет, который переводит заказы из статуса processing в completed, если они находятся в статусе более 3 дней:
function wpnews_auto_update_order_status() {
$args = array(
'status' => 'processing',
'limit' => -1,
'date_modified' => '<' . ( time() - 3 * DAY_IN_SECONDS ),
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
// Проверяем дату создания заказа
$order_date = strtotime( $order->get_date_created() );
if ( $order_date && $order_date <= ( time() - 3 * DAY_IN_SECONDS ) ) {
$order->update_status( 'completed', 'Статус изменён автоматически через 3 дня в статусе processing.' );
}
}
}
2. Запускаем функцию по расписанию через WP-Cron
Добавим крон-задачу, которая будет запускаться ежедневно:
function wpnews_schedule_order_status_update() {
if ( ! wp_next_scheduled( 'wpnews_daily_order_status_update' ) ) {
wp_schedule_event( time(), 'daily', 'wpnews_daily_order_status_update' );
}
}
add_action( 'wp', 'wpnews_schedule_order_status_update' );
add_action( 'wpnews_daily_order_status_update', 'wpnews_auto_update_order_status' );
3. Остановка автоматизации (если нужно)
Чтобы удалить задачу, используйте:
function wpnews_unschedule_order_status_update() {
$timestamp = wp_next_scheduled( 'wpnews_daily_order_status_update' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpnews_daily_order_status_update' );
}
}
// wpnews_unschedule_order_status_update(); // вызвать однократно для удаления
Как проверить, что автоматическое изменение статуса сработало
- Зайдите в WooCommerce > Заказы и найдите заказы со статусом
completed, которые ранее былиprocessingи созданы более 3 дней назад. - Посмотрите в комментарии к заказу: должно появиться сообщение "Статус изменён автоматически через 3 дня в статусе processing."
- Для отладки можно добавить
error_logвнутри функции, например:error_log('Обновлён заказ №' . $order->get_id());и смотреть логи сервера.
Частые ошибки и как их исправить
- Крон-задача не запускается: Проверьте, что в WordPress корректно работает WP-Cron, посетите сайт и убедитесь, что в
wp_optionsесть запись с расписанием. Если на хостинге отключён WP-Cron, настройте системный cron для вызоваwp-cron.php. - Заказы не обновляются: Убедитесь, что статусы и даты проверяются корректно. Для отладки выведите в лог значения дат и статусов.
- Функция обновления запускается слишком часто или редко: Проверьте период запуска в
wp_schedule_event— 'daily' означает раз в 24 часа, можно использовать свои интервалы, регистрируя их черезcron_schedules. - Проблемы с правами доступа: Сниппеты должны быть добавлены в файл
functions.phpдочерней темы или в свой плагин, а не в плагины, которые могут конфликтовать.
Практические советы по безопасности и производительности
- Используйте
wc_get_ordersс параметромlimitи пагинацией, если заказов очень много, чтобы избежать превышения лимита памяти и таймаутов. - Добавляйте логику в функции, которая не изменяет статусы без необходимости — проверяйте дату и статус.
- Для критичных операций лучше делать резервное копирование базы перед запуском автоматизации.
- Соблюдайте принцип минимальных прав — не запускайте код от администратора, если это не нужно.
- Если автоматизация нужна более гибкая — рассмотрите использование WPShop Clearfy Pro для оптимизации и очистки, а также интеграцию с WP-Cron через WP-CLI для надёжности.
Сравнение вариантов реализации автоматического обновления статусов заказов
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| Сниппет с WP-Cron | Бесплатно, гибко, легко кастомизируется | Зависит от корректной работы WP-Cron, при большом количестве заказов может тормозить | Пример в статье |
| Плагин автоматизации заказов | Готовое решение, поддержка, интерфейс | Платно или с избыточным функционалом, нагрузка | WooCommerce Order Status Manager и др. |
| Внешний cron + WP-CLI | Надёжнее WP-Cron, подходит для больших сайтов | Нужен доступ к серверу, сложнее в настройке | wp cron event run wpnews_daily_order_status_update |