Зачем нужно автоматическое изменение статуса заказа в WooCommerce
Автоматическое изменение статуса заказа в WooCommerce помогает оптимизировать обработку заказов, особенно если часть заказов нужно переводить из статуса "в обработке" в "завершён" или "отменён" спустя определённое время без ручного вмешательства. Такая автоматизация снижает нагрузку на менеджеров и улучшает пользовательский опыт.
Диагностика задачи и подготовка к решению
Перед реализацией нужно четко определить бизнес-логику:
- Какой статус меняется и на какой (например, из «processing» в «completed» или «cancelled»).
- Через сколько времени после создания заказа должен меняться статус.
- Нужно ли учитывать дополнительные условия (например, оплата, доставка).
Также проверьте, включен ли WP-Cron и работает ли он корректно, так как решение будет основано на периодическом запуске задач.
Как реализовать автоматическое изменение статуса заказа по времени
1. Добавляем пользовательское событие в WP-Cron
Сначала регистрируем собственное событие, которое будет запускать функцию проверки и изменения статусов заказов:
function wc_custom_cron_activation() {
if ( ! wp_next_scheduled( 'wc_change_order_status_cron_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wc_change_order_status_cron_hook' );
}
}
add_action( 'wp', 'wc_custom_cron_activation' );2. Определяем функцию изменения статуса заказов
Создадим функцию, которая будет искать заказы в статусе «processing» старше, например, 7 дней и переводить их в «completed»:
add_action( 'wc_change_order_status_cron_hook', 'wc_change_order_status_automatically' );
function wc_change_order_status_automatically() {
$args = [
'limit' => -1,
'status' => 'processing',
'date_created' => '<' . ( time() - WEEK_IN_SECONDS ),
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
// Проверяем, что заказ действительно старше 7 дней
$created = $order->get_date_created()->getTimestamp();
if ( $created < ( time() - WEEK_IN_SECONDS ) ) {
$order->update_status( 'completed', 'Статус автоматически изменён после 7 дней обработки.' );
}
}
}3. Очистка при деактивации темы или плагина
Чтобы не оставлять задач в WP-Cron после удаления кода, добавим удаление задачи:
function wc_custom_cron_deactivation() {
$timestamp = wp_next_scheduled( 'wc_change_order_status_cron_hook' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wc_change_order_status_cron_hook' );
}
}
register_deactivation_hook( __FILE__, 'wc_custom_cron_deactivation' );Проверка результата после внедрения
Для проверки правильности работы:
- Создайте тестовый заказ со статусом «processing» и датой создания более 7 дней назад (можно изменить дату через базу или плагин для тестирования).
- Запустите WP-Cron вручную для теста, например, с помощью плагина WP Crontrol.
- Проверьте, что статус заказа изменился на «completed» и появилась запись в истории изменений с вашим комментарием.
Частые ошибки и их исправление
- Событие WP-Cron не запускается: проверьте, что на сервере посетители посещают сайт или настройте системный cron для запуска wp-cron.php (пример:
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1). - Заказы не находятся: убедитесь, что используете правильный параметр
'date_created'вwc_get_ordersи формат даты соответствует требованиям (timestamp Unix). - Статус не меняется: проверьте, что у функции
update_statusправильные параметры и у пользователя/процесса есть права на изменение заказов.
Практические советы по безопасности и производительности
- Проверяйте количество обрабатываемых заказов, чтобы избежать таймаутов скрипта. Можно обрабатывать партии по 50-100 заказов за раз.
- Добавьте логирование действий в отдельный файл или в debug.log для контроля работы скрипта.
- Используйте проверки nonce и прав, если функция будет вызываться через AJAX или REST API.
- Для повышения производительности рассмотрите использование транзиентов для кеширования выборки заказов, если скрипт вызывается часто.
Сравнение вариантов реализации автоматического изменения статуса заказа
| Вариант | Преимущества | Недостатки | Рекомендуемая сфера |
|---|---|---|---|
| WP-Cron + пользовательский код | Полный контроль, гибкость, отсутствие плагинов | Зависит от WP-Cron, требует навыков программирования | Средние и крупные проекты с кастомной логикой |
| Плагины автоматизации (например, AutomateWoo) | Удобный интерфейс, готовые триггеры | Платные, нагрузка на сайт, ограниченная гибкость | Малые проекты, где нет разработчиков |
| Внешние скрипты с WP-CLI | Полный контроль, не зависит от WP-Cron | Требует доступа к серверу, сложнее в настройке | Серверы с SSH доступом, опытные администраторы |