WooCommerce: автоматическое изменение статуса возврата после просрочки

Проблема: как автоматически менять статус возврата после истечения срока обработки

В WooCommerce стандартный процесс возврата товаров часто требует ручного изменения статуса возврата в админке. Если возврат не обрабатывается своевременно, это создает трудности и отрицательно влияет на клиентский опыт. Задача — автоматизировать смену статуса возврата (например, из "Ожидает возврата" в "Просрочен") после определенного количества дней.

Диагностика проблемы

Проверьте, используется ли в вашем магазине расширение для возвратов (refunds) или заказам присваиваются пользовательские статусы возврата. Если возврат — это просто заказ с определенным статусом, то задача сводится к массовой проверке заказов с этим статусом и автоматическому обновлению.

Для диагностики можно выполнить SQL-запрос для подсчета заказов со статусом возврата и датой создания:

SELECT ID, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-refund-pending';

Замените wc-refund-pending на актуальный статус возврата в вашем магазине.

Решение: пошаговая инструкция с кодом

1. Добавляем пользовательский статус возврата "Просрочен" в WooCommerce

Чтобы иметь статус возврата "Просрочен", зарегистрируем его в WooCommerce:

add_filter('wc_order_statuses', 'register_custom_refund_status');
function register_custom_refund_status($order_statuses) {
    $order_statuses['wc-refund-overdue'] = _x('Просрочен', 'Order status', 'woocommerce');
    return $order_statuses;
}

add_action('init', 'add_custom_refund_status');
function add_custom_refund_status() {
    register_post_status('wc-refund-overdue', array(
        'label' => 'Просрочен',
        'public' => true,
        'exclude_from_search' => false,
        'show_in_admin_all_list' => true,
        'show_in_admin_status_list' => true,
        'label_count' => _n_noop('Просрочен <span class="count">(%s)</span>', 'Просрочен <span class="count">(%s)</span>'),
    ));
}

2. Создаем крон-задачу для проверки и обновления просроченных возвратов

Добавляем функцию, которая будет запускаться ежедневно и менять статус заказов, если срок возврата превышен:

if (!wp_next_scheduled('check_refund_overdue_hook')) {
    wp_schedule_event(time(), 'daily', 'check_refund_overdue_hook');
}

add_action('check_refund_overdue_hook', 'check_and_update_refund_status');

function check_and_update_refund_status() {
    $days_limit = 7; // Кол-во дней до просрочки
    $date_limit = date('Y-m-d H:i:s', strtotime("-{$days_limit} days"));

    $args = array(
        'limit' => -1,
        'status' => 'refund-pending', // замените на ваш статус возврата
        'date_created' => '<' . $date_limit,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        $order->update_status('refund-overdue', 'Автоматическое обновление статуса возврата после просрочки.');
    }
}

Замените refund-pending на актуальный статус возврата в вашем магазине.

Как проверить, что решение работает

  • Создайте тестовый заказ и установите ему статус возврата, например, "refund-pending".
  • Измените дату создания заказа на дату более 7 дней назад в базе, чтобы проверить срабатывание.
  • Выполните вручную хук для теста:
do_action('check_refund_overdue_hook');
  • Проверьте в админке, что статус заказа изменился на "Просрочен".
  • Подождите следующий запуск крона (или инициируйте его вручную) и убедитесь, что обновления происходят автоматически.

Частые ошибки и как их исправить

  • Статус возврата не меняется: проверьте, что используете правильные имена статусов. В WooCommerce статус заказа всегда с префиксом wc- в базе, но в коде передается без префикса.
  • Крон-задача не запускается: убедитесь, что на сайте включен WP-Cron и он срабатывает (например, при заходе на сайт). Для отладки используйте плагин WP Crontrol.
  • Заказы не выбираются: проверьте параметры wc_get_orders, особенно фильтр по дате и статусу.
  • Статус "Просрочен" не отображается в админке: проверьте регистрацию статуса с правильными параметрами и очистите кэш админки.

Практические рекомендации по безопасности и производительности

  • Для больших магазинов с тысячами возвратов избегайте выборки всех заказов сразу — добавляйте пагинацию или ограничение лимита.
  • Добавляйте логирование работы крона для отладки и мониторинга.
  • Не меняйте статус заказов без проверки прав пользователя, если вы расширяете функционал для фронтенда.
  • Используйте проверку nonce и capability для функций, вызываемых вручную.

Сравнение вариантов реализации автоматического обновления статусов возвратов

МетодПреимуществаНедостаткиКомпромисс
Плагин для возвратов с автозаменой статусовГотовое решение, поддержкаПлатные, могут нагружать сайтИспользовать для крупных магазинов
Собственный код с WP-CronЛегкий, настраиваемый, бесплатныйТребует поддержки, ограничен по масштабируемостиПодходит для средних и малых магазинов
Ручное изменение статусовПростотаТрудоемко, ошибки из-за человеческого фактораИспользовать как временное решение
WooCommerce: как автоматически отключать электронные письма после отмены заказа
27.06.2026
Как удалить ревизии записей в WordPress без плагинов
14.12.2025
WooCommerce: автоматическое изменение цен и скидок при обновлении атрибутов товара
08.06.2026
Как удалить заблокированные аккаунты пользователей в WordPress
02.01.2026
Автоматическое удаление неактивных товаров и вариаций в WooCommerce
08.07.2026