Диагностика задачи: зачем автоматически изменять статус заказов
В магазинах на WooCommerce часто возникает потребность автоматизировать управление статусами заказов, чтобы не держать в активном состоянии старые или неактивные заказы. Например, заказы, которые не были оплачены или обработаны в течение длительного времени, нужно перевести в статус «неактивные» или «отменённые» для удобства учёта и очистки базы.
Стандартного функционала для такой автоматизации в WooCommerce нет, поэтому задача решается кастомным кодом с использованием WP-Cron или хуков.
Пошаговое решение: автоматическое изменение статуса заказов по времени
1. Создание функции для обновления статусов
Сначала создадим функцию, которая будет искать заказы в определённом статусе и менять их статус на нужный, если они старше заданного времени.
function wplog_set_orders_to_inactive() {
$days_inactive = 30; // количество дней до смены статуса
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
$args = array(
'limit' => -1,
'status' => array('pending', 'on-hold'), // статусы для проверки
'date_created' => '<' . $date_threshold,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
$order->update_status('cancelled', 'Автоматическое изменение статуса после 30 дней неактивности');
}
}
}2. Подключение функции к WP-Cron для регулярного выполнения
Добавим событие, которое будет запускать функцию ежедневно.
function wplog_schedule_inactive_orders_cron() {
if (!wp_next_scheduled('wplog_daily_inactive_orders')) {
wp_schedule_event(time(), 'daily', 'wplog_daily_inactive_orders');
}
}
add_action('wp', 'wplog_schedule_inactive_orders_cron');
add_action('wplog_daily_inactive_orders', 'wplog_set_orders_to_inactive');3. Очистка расписания при деактивации темы или плагина
function wplog_clear_inactive_orders_cron() {
$timestamp = wp_next_scheduled('wplog_daily_inactive_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wplog_daily_inactive_orders');
}
}
register_deactivation_hook(__FILE__, 'wplog_clear_inactive_orders_cron');Проверка результата после внедрения
Для проверки корректности работы:
- Создайте тестовый заказ со статусом
pendingилиon-hold, установите дату создания более 30 дней назад через базу данных или плагины для редактирования заказов. - Запустите вручную крон-событие в WP-CLI:
wp cron event run wplog_daily_inactive_orders - Проверьте, что статус заказа изменился на
cancelled.
Частые ошибки и их исправление
- Функция не запускается — проверьте, что WP-Cron работает на сервере. Для теста используйте WP-CLI или сторонний плагин управления кроном.
- Заказы не обновляются — убедитесь, что у заказов правильный статус и дата создания действительно старше указанного порога.
- Конфликты с другими плагинами — отключите плагины, которые могут влиять на статусы заказов, и повторите тест.
- Повторный запуск крон-события — используйте функции
wp_next_scheduled()иwp_unschedule_event()для корректного управления задачами.
Практические советы по безопасности и производительности
- Добавляйте ограничения на количество обрабатываемых заказов в одном запуске, чтобы избежать перегрузки сервера:
$args['limit'] = 100; // обрабатываем партиями по 100 заказов- Логируйте изменения статусов для отладки и аудита, например, используя стандартный лог WordPress или отдельный файл.
- Если сайт большой, рассмотрите использование внешних CRON-сервисов вместо стандартного WP-Cron, чтобы избежать нерегулярных запусков.
- Для кастомных статусов («неактивные») создавайте их через
register_post_status()и используйте вместо стандартных, если хотите сохранить логику заказов.
Сравнение вариантов автоматизации изменения статусов заказов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Код с WP-Cron (пример выше) | Контроль, гибкость, бесплатно | Нужны навыки программирования, зависит от WP-Cron | Для опытных разработчиков и средних магазинов |
| Плагины автоматизации (например, AutomateWoo) | Удобный интерфейс, много функций | Платно, нагрузка на сайт | Для магазинов с бюджетом и сложной логикой |
| Внешние CRON-сервисы + API | Надёжность, точность | Сложно настроить, требует API и навыков | Для крупных проектов с высокой нагрузкой |