WooCommerce: как отменить и изменить статус возврата товара

Диагностика проблемы с возвратом товара в 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Возможна избыточность, влияние на производительность
Как создать автоматический импорт пользовательских данных в WordPress
26.03.2026
Как избежать фейковых регистраций в WordPress: проверенные методы и примеры
24.12.2025
Как удалить все старые метаданные в WordPress
09.02.2026
Как использовать REST API для управления пользователями в WordPress
07.01.2026
Как автоматизировать создание отзывов в WordPress с помощью плагинов и кода
21.02.2026