Диагностика проблемы с возвратом товара в WooCommerce
Часто магазины на WooCommerce сталкиваются с необходимостью не только оформить возврат товара, но и отменить его или изменить статус возврата на произвольный. Стандартный функционал WooCommerce позволяет менять статусы заказов, но не всегда удобно управлять возвратами через стандартные статусы или метки. Поэтому важно понять, как именно устроен процесс возврата и статусы заказов в WooCommerce, чтобы грамотно его кастомизировать.
Как проверить текущий статус возврата
Статусы возврата в WooCommerce чаще всего связаны с изменением статуса заказа, например, refunded (возврат) или completed (завершён). Для диагностики текущего статуса можно использовать следующий код в файле темы или плагина:
function check_order_status( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) return 'Заказ не найден';
return $order->get_status();
}Вызов check_order_status(123) вернёт статус заказа с ID 123. Это поможет понять, как именно WooCommerce хранит информацию о возврате.
Пошаговое решение: отмена и изменение статуса возврата
1. Добавление пользовательского статуса возврата
WooCommerce позволяет создавать пользовательские статусы заказов. Добавим новый статус "Возврат отменён".
// Регистрируем новый статус
add_action( 'init', function() {
register_post_status( 'wc-return-cancelled', 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>' ),
) );
});
// Добавляем статус в список WooCommerce
add_filter( 'wc_order_statuses', function( $order_statuses ) {
$order_statuses['wc-return-cancelled'] = 'Возврат отменён';
return $order_statuses;
});2. Изменение статуса возврата через админку или код
Теперь можно изменить статус заказа программно или через панель администратора. Пример смены статуса заказа с возврата на отменённый возврат:
$order_id = 123; // ID заказа
$order = wc_get_order( $order_id );
if ( $order && $order->has_status( 'refunded' ) ) {
$order->update_status( 'return-cancelled', 'Возврат отменён администратором' );
}3. Автоматизация возврата с возможностью отмены
Можно добавить кнопку в админке для отмены возврата — пример с использованием фильтра woocommerce_admin_order_actions:
add_filter( 'woocommerce_admin_order_actions', function( $actions, $order ) {
if ( $order->has_status( 'refunded' ) ) {
$actions['cancel_return'] = array(
'url' => wp_nonce_url( admin_url( 'admin-post.php?action=cancel_return&order_id=' . $order->get_id() ), 'cancel_return' ),
'name' => 'Отменить возврат',
'action' => 'cancel_return',
);
}
return $actions;
}, 10, 2);
add_action( 'admin_post_cancel_return', function() {
if ( ! current_user_can( 'edit_shop_orders' ) || ! check_admin_referer( 'cancel_return' ) ) {
wp_die( 'Доступ запрещён' );
}
$order_id = intval( $_GET['order_id'] );
$order = wc_get_order( $order_id );
if ( $order && $order->has_status( 'refunded' ) ) {
$order->update_status( 'return-cancelled', 'Возврат отменён через админку' );
}
wp_redirect( wp_get_referer() );
exit;
});Проверка результата после внедрения
Чтобы проверить, что возврат успешно отменён и статус изменён:
- Перейдите в WooCommerce → Заказы и откройте заказ с возвратом;
- Проверьте, что в списке статусов появился новый статус "Возврат отменён";
- Если вы добавили кнопку отмены возврата — убедитесь, что она отображается для заказов со статусом
refunded; - После нажатия кнопки статус заказа должен поменяться на "Возврат отменён";
- Дополнительно проверьте в базе данных в таблице
wp_postsполеpost_statusдля этого заказа; - Для дополнительной проверки можно вывести статус заказа с помощью кода
var_dump( $order->get_status() );.
Частые ошибки и как исправить
- Статус не отображается в админке: Проверьте, правильно ли добавлен фильтр
wc_order_statusesи зарегистрирован статус с префиксомwc-. Без него WooCommerce не распознает новый статус. - Кнопка отмены не появляется: Убедитесь, что фильтр
woocommerce_admin_order_actionsкорректно добавлен и у пользователя есть праваedit_shop_orders. - Статус не меняется через код: Проверьте, что объект заказа получен правильно через
wc_get_order()и что методupdate_status()вызывается без ошибок. - Проблемы с безопасностью при смене статуса: Используйте nonce в URL и проверяйте права пользователя, чтобы избежать CSRF-атак.
Практические советы по безопасности и производительности
- Для операций с заказами всегда проверяйте права пользователя, чтобы исключить несанкционированные изменения.
- Используйте nonce для защиты форм и ссылок, связанных с изменением статусов.
- Избегайте лишних запросов к базе, кешируйте объекты заказов при необходимости.
- Если планируется массовое изменение статусов, реализуйте обработку через wp-cron или WP CLI, чтобы не перегружать сервер.
Сравнение вариантов реализации отмены возврата
| Метод | Плюсы | Минусы |
|---|---|---|
| Использование стандартных статусов | Простота, совместимость с плагинами | Ограниченная гибкость, неудобство для конкретных сценариев возврата |
| Добавление пользовательского статуса | Гибкость, возможность кастомных процессов | Требует дополнительного кода и поддержки |
| Использование плагинов для возврата | Готовые решения, удобный UI | Возможна избыточность, влияние на производительность |