Проблема: отсутствие контроля над процессом возврата товара в WooCommerce
В стандартной комплектации WooCommerce нет встроенного механизма, позволяющего администратору магазина контролировать и подтверждать возвраты товаров. Это создает риск несанкционированных возвратов и усложняет учет.
Диагностика задачи
Перед добавлением функционала подтверждения возврата важно понять, как сейчас обрабатываются возвраты на вашем сайте:
- Используете ли вы встроенные статусы заказов или кастомные статусы для возвратов?
- Как покупатели инициируют возврат — через комментарии, email или отдельную форму?
- Хотите ли вы автоматизировать уведомления и изменить статус заказа только после подтверждения администратора?
Пошаговое решение: добавляем статус «Возврат на подтверждении» и обработку
1. Регистрация кастомного статуса заказа
Добавим новый статус «Возврат на подтверждении» для отслеживания возвратов, ожидающих проверки.
add_action('init', function() {
register_post_status('wc-return-pending', 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. Добавление статуса в список статусов WooCommerce
add_filter('wc_order_statuses', function($order_statuses) {
$order_statuses['wc-return-pending'] = 'Возврат на подтверждении';
return $order_statuses;
});3. Создание кнопки подтверждения возврата в админке
Добавим кнопку в страницу редактирования заказа, чтобы администратор мог подтвердить возврат и изменить статус.
add_action('woocommerce_order_actions', function($actions) {
$actions['confirm_return'] = 'Подтвердить возврат';
return $actions;
});
add_action('woocommerce_order_action_confirm_return', function($order) {
$order->update_status('refunded', 'Возврат подтверждён администратором');
});4. Автоматизация уведомления покупателя
Создадим email уведомление для покупателя при смене статуса на «refunded» после подтверждения возврата.
add_action('woocommerce_order_status_refunded', function($order_id) {
$order = wc_get_order($order_id);
$mailer = WC()->mailer();
$mails = $mailer->get_emails();
if (!empty($mails['WC_Email_Customer_Refunded_Order'])) {
$mails['WC_Email_Customer_Refunded_Order']->trigger($order_id);
}
});Проверка результата
- Создайте заказ в WooCommerce и назначьте статус
Возврат на подтверждении. - В админке откройте заказ и убедитесь, что появилась кнопка «Подтвердить возврат» в действиях заказа.
- Нажмите на кнопку и проверьте, что статус изменился на «Возврат завершён» (refunded).
- Проверьте, что покупателю пришло уведомление по email о возврате.
Частые ошибки и как их исправить
- Статус не отображается в списках заказов
Решение: проверьте, чтоregister_post_statusвызывается наinitи что фильтрwc_order_statusesправильно добавляет статус с префиксомwc-. - Кнопка подтверждения не появляется в админке
Убедитесь, что используете правильный хукwoocommerce_order_actionsи что пользователь имеет права на редактирование заказа. - Письмо покупателю не отправляется
Проверьте, что email уведомления включены в WooCommerce > Настройки > Email и что код триггера вызывается после смены статуса.
Практические советы по безопасности и производительности
- Для безопасности проверяйте права пользователя перед изменением статуса заказа в обработчике кнопки.
if (!current_user_can('edit_shop_orders')) { wp_die('Недостаточно прав для подтверждения возврата.'); } - Для производительности избегайте частых вызовов
update_statusбез необходимости, чтобы не создавать много хуков и писем. - Если возвраты частые, подумайте о создании отдельного плагина с функционалом возвратов, чтобы легче поддерживать и обновлять код.
Сравнение способов реализации подтверждения возврата
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Кастомный статус + кнопка в админке | Гибкость, полный контроль, не требует сторонних плагинов | Требует базовых навыков PHP, нужно поддерживать код | Оптимален для небольших магазинов и разработчиков |
| Плагины возвратов (например, WooCommerce RMA) | Готовый функционал, поддержка, интерфейс для клиентов | Платные, могут перегрузить сайт | Подходит для больших магазинов с высокой нагрузкой |
| Обработка возвратов вручную через email/комментарии | Минимальные затраты | Много ручной работы, ошибки, отсутствие контроля | Использовать только для тестирования или очень маленьких магазинов |