В проектах на WordPress с WooCommerce часто возникает задача автоматического обновления статусов заказов на основе определённых условий. Например, менять статус заказа на "Выполнен" через определённое количество дней после оплаты или автоматически отменять заказы с просроченной оплатой. В этой статье подробно разберём создание собственного автоматического скрипта для обновления статусов заказов в WooCommerce с примерами кода и рекомендациями по оптимизации.
Почему важно автоматизировать обновление статусов заказов в WooCommerce
Автоматизация обновления статусов заказов экономит время менеджеров и снижает вероятность ошибок. Вместо ручного контроля и изменения статусов можно настроить скрипт, который будет выполнять нужные действия в фоновом режиме.
Например, если заказ оплачен, но не был отправлен в течение 3 дней, можно автоматически изменить статус на "Отменён" и уведомить клиента. Или после доставки автоматически менять статус на "Выполнен" через 7 дней.
Для реализации таких сценариев удобно использовать WP Cron — встроенную систему планировщика задач WordPress, а также API WooCommerce для работы с заказами.
Настройка WP Cron для регулярного запуска скрипта
WP Cron позволяет запускать функции через заданные интервалы. Для нашего скрипта создадим собственное событие с интервалом, например, 1 час.
Добавим в functions.php или в плагин следующий код:
function wporders_add_cron_interval( $schedules ) {
if( !isset( $schedules['hourly'] ) ) {
$schedules['hourly'] = array(
'interval' => 3600,
'display' => __('Каждый час')
);
}
return $schedules;
}
add_filter('cron_schedules', 'wporders_add_cron_interval');
function wporders_schedule_order_status_update() {
if (!wp_next_scheduled('wporders_update_order_status_event')) {
wp_schedule_event(time(), 'hourly', 'wporders_update_order_status_event');
}
}
add_action('wp', 'wporders_schedule_order_status_update');
Здесь мы добавили интервал "hourly" и запланировали событие wporders_update_order_status_event, которое будет вызываться каждый час.
Создание функции для обновления статусов заказов
Теперь реализуем функцию, которая будет запускаться по крону и менять статусы заказов в зависимости от их даты и текущего статуса.
Пример кода:
function wporders_update_order_status() {
// Получаем заказы со статусом "processing" старше 3 дней
$args = array(
'limit' => -1,
'status' => 'processing',
'date_modified' => '<=' . ( time() - 3 * DAY_IN_SECONDS ),
);
$orders = wc_get_orders($args);
foreach ( $orders as $order ) {
// Меняем статус на "cancelled"
$order->update_status('cancelled', 'Автоматическая отмена заказа по истечении 3 дней.');
}
// Получаем заказы со статусом "completed" старше 7 дней
$args_completed = array(
'limit' => -1,
'status' => 'completed',
'date_modified' => '<=' . ( time() - 7 * DAY_IN_SECONDS ),
);
$completed_orders = wc_get_orders($args_completed);
foreach ( $completed_orders as $order ) {
// Добавим пользовательскую логику, например, отправляем благодарственное письмо
// wporders_send_thank_you_email($order);
}
}
add_action('wporders_update_order_status_event', 'wporders_update_order_status');
Обратите внимание, что параметр date_modified в wc_get_orders не является стандартным фильтром, поэтому для фильтрации по дате лучше использовать аргумент 'date_created' или реализовать свою логику.
Правильный способ получить заказы старше N дней:
function wporders_update_order_status() {
$date_threshold = date('Y-m-d H:i:s', strtotime('-3 days'));
$args = array(
'limit' => -1,
'status' => 'processing',
'date_created' => '<=' . $date_threshold,
);
$orders = wc_get_orders($args);
foreach ( $orders as $order ) {
$order->update_status('cancelled', 'Автоматическая отмена заказа по истечении 3 дней.');
}
}
Такой подход надёжно фильтрует заказы по дате создания.
Оптимизация и безопасность скрипта
При работе с массовым обновлением заказов важно контролировать нагрузку на сервер. Если заказов слишком много, лучше обрабатывать их порциями. Для этого можно использовать аргумент limit и запускать крон чаще.
Также стоит добавить логирование действий, чтобы отслеживать изменения и быстро реагировать на ошибки.
Пример логирования:
function wporders_log($message) {
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log('[wporders] ' . $message);
}
}
// Использование внутри функции
wporders_log('Обновлен статус заказа #' . $order->get_id());
Пример интеграции с плагином Clearfy Pro для оптимизации cron
Если на сайте установлен плагин Clearfy Pro, можно использовать встроенные инструменты для управления WP Cron и оптимизации задач. Clearfy позволяет отключать ненужные задачи, объединять крон-события и снижать нагрузку.
Это особенно полезно для сайтов с большим количеством заказов и активными задачами.
Заключение по созданию скрипта обновления статусов заказов
Автоматизация обновления статусов заказов в WooCommerce — важный элемент эффективной работы интернет-магазина. Используя WP Cron, API WooCommerce и оптимальные фильтры, вы сможете создавать надёжные и производительные скрипты без привлечения сторонних плагинов.
Если хотите быстро начать и получить расширенный функционал, рекомендую обратить внимание на плагины, которые уже реализуют подобные задачи с удобным интерфейсом, например, расширения для управления заказами на WPSHOP.