Проблема: как автоматически менять статус возврата после истечения срока обработки
В 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 | Легкий, настраиваемый, бесплатный | Требует поддержки, ограничен по масштабируемости | Подходит для средних и малых магазинов |
| Ручное изменение статусов | Простота | Трудоемко, ошибки из-за человеческого фактора | Использовать как временное решение |