Как добавить поддержку Restorer в WooCommerce для возврата товаров

Что такое Restorer и зачем он нужен в WooCommerce

Restorer — это дополнительный функционал для управления возвратами товаров в WooCommerce. По умолчанию WooCommerce не предоставляет встроенных инструментов для полноценного возврата с учетом состояния товара, причины возврата и автоматизации процессов. Добавление поддержки Restorer позволяет расширить возможности магазина, повысить уровень клиентского сервиса и упростить администрирование возвратов.

Диагностика проблемы: почему стандартный WooCommerce не подходит для возвратов

Если вы столкнулись с задачей организовать возврат товаров через WooCommerce, то обнаружите, что стандартный функционал ограничивается отменой заказа или возвратом средств вручную. Нет возможности:

  • Отслеживать причины возврата и состояние товара;
  • Автоматизировать процесс обработки возвратов;
  • Интегрировать возвраты с бухгалтерией или складом;
  • Давать клиентам удобный интерфейс для подачи заявки на возврат.

Проверка: откройте страницу заказа в админке WooCommerce и проверьте наличие опций для создания заявки на возврат — их там нет.

Пошаговое решение: добавляем поддержку Restorer в WooCommerce

1. Создаем кастомный тип поста «Возврат»

В файле functions.php вашей темы или в собственном плагине добавьте регистрацию типа поста для возвратов:

function register_return_post_type() {
    $labels = array(
        'name'               => 'Возвраты',
        'singular_name'      => 'Возврат',
        'menu_name'          => 'Возвраты',
        'add_new'            => 'Добавить возврат',
        'add_new_item'       => 'Добавить новый возврат',
        'edit_item'          => 'Редактировать возврат',
        'new_item'           => 'Новый возврат',
        'view_item'          => 'Просмотреть возврат',
        'search_items'       => 'Искать возвраты',
        'not_found'          => 'Возвраты не найдены',
        'not_found_in_trash' => 'Возвраты не найдены в корзине'
    );
    $args = array(
        'labels'             => $labels,
        'public'             => false,
        'show_ui'            => true,
        'show_in_menu'       => 'woocommerce',
        'capability_type'    => 'post',
        'supports'           => array('title', 'editor', 'custom-fields'),
        'has_archive'        => false,
    );
    register_post_type('wc_return', $args);
}
add_action('init', 'register_return_post_type');

2. Добавляем мета-поля для возврата товара

Используем add_meta_box для добавления полей в админку возврата:

function add_return_meta_boxes() {
    add_meta_box('return_details', 'Детали возврата', 'render_return_meta_box', 'wc_return', 'normal', 'high');
}
add_action('add_meta_boxes', 'add_return_meta_boxes');

function render_return_meta_box($post) {
    $order_id = get_post_meta($post->ID, '_order_id', true);
    $return_reason = get_post_meta($post->ID, '_return_reason', true);
    $return_status = get_post_meta($post->ID, '_return_status', true);
    ?>
    <p><label>Номер заказа: <input type="number" name="_order_id" value="<?php echo esc_attr($order_id); ?>" /></label></p>
    <p><label>Причина возврата:<br /><textarea name="_return_reason" rows="4"><?php echo esc_textarea($return_reason); ?></textarea></label></p>
    <p><label>Статус возврата:
        <select name="_return_status">
            <option value="pending" <?php selected($return_status, 'pending'); ?>>Ожидает</option>
            <option value="approved" <?php selected($return_status, 'approved'); ?>>Одобрен</option>
            <option value="rejected" <?php selected($return_status, 'rejected'); ?>>Отклонен</option>
        </select>
    </label></p>
    <?php
}

function save_return_meta($post_id) {
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    if (isset($_POST['_order_id'])) {
        update_post_meta($post_id, '_order_id', intval($_POST['_order_id']));
    }
    if (isset($_POST['_return_reason'])) {
        update_post_meta($post_id, '_return_reason', sanitize_textarea_field($_POST['_return_reason']));
    }
    if (isset($_POST['_return_status'])) {
        update_post_meta($post_id, '_return_status', sanitize_text_field($_POST['_return_status']));
    }
}
add_action('save_post_wc_return', 'save_return_meta');

3. Создаем фронтенд-форму для подачи заявки на возврат

Добавьте в шаблон или с помощью шорткода форму для клиента:

function render_return_request_form() {
    if (!is_user_logged_in()) {
        return '<p>Пожалуйста, войдите, чтобы подать заявку на возврат.</p>';
    }
    if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['return_order_id'])) {
        $order_id = intval($_POST['return_order_id']);
        $reason = sanitize_textarea_field($_POST['return_reason']);
        $user_id = get_current_user_id();

        // Проверяем принадлежность заказа пользователю
        $order = wc_get_order($order_id);
        if (!$order || $order->get_user_id() != $user_id) {
            return '<p>Неверный номер заказа.</p>';
        }

        // Создаем возврат
        $return_id = wp_insert_post(array(
            'post_type' => 'wc_return',
            'post_title' => 'Возврат заказа #' . $order_id,
            'post_status' => 'publish',
        ));
        if ($return_id) {
            update_post_meta($return_id, '_order_id', $order_id);
            update_post_meta($return_id, '_return_reason', $reason);
            update_post_meta($return_id, '_return_status', 'pending');
            return '<p>Заявка на возврат успешно отправлена.</p>';
        } else {
            return '<p>Ошибка при отправке заявки.</p>';
        }
    }

    ob_start();
    ?>
    <form method="post">
        <p><label>Номер заказа:<input type="number" name="return_order_id" required /></label></p>
        <p><label>Причина возврата:<br /><textarea name="return_reason" rows="4" required></textarea></label></p>
        <p><input type="submit" value="Отправить заявку" /></p>
    </form>
    <?php
    return ob_get_clean();
}
add_shortcode('return_request_form', 'render_return_request_form');

Проверка результата после внедрения

  • В админке WooCommerce появится раздел «Возвраты» с созданными заявками;
  • Клиенты смогут отправлять заявки на возврат через форму с шорткодом [return_request_form];
  • В заявках видно номер заказа, причину и статус возврата;
  • Администратор может изменять статус возврата и вести учет.

Для проверки создайте тестовый заказ, войдите под пользователем и отправьте заявку через форму. Затем проверьте в админке появление заявки с правильными мета-данными.

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

  • Ошибка: Форма не отправляет данные или не создается заявка.
    Причина: Отсутствует проверка is_user_logged_in() или конфликт с nonce.
    Решение: Добавьте nonce для безопасности и проверьте права пользователя.
  • Ошибка: Админка не отображает тип поста «Возврат».
    Причина: Неправильно указан параметр show_in_menu или не зарегистрирован тип поста.
    Решение: Убедитесь, что регистрация происходит на хук init и show_in_menu => 'woocommerce'.
  • Ошибка: Возвраты не связаны с заказами.
    Причина: Нет проверки и сохранения номера заказа как мета-поля.
    Решение: Используйте мета-поля и проверяйте принадлежность заказа пользователю.

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

  • Обязательно используйте wp_nonce_field() и проверяйте nonce при обработке форм, чтобы избежать CSRF-атак.
  • Санитизируйте все входящие данные с помощью sanitize_textarea_field, intval и других функций.
  • Ограничьте количество запросов на создание возврата для одного пользователя за определенный период, чтобы предотвратить спам.
  • Для улучшения производительности используйте WP Query с мета-запросами по номеру заказа для быстрого поиска возвратов.

Сравнение вариантов реализации поддержки возвратов в WooCommerce

ВариантПреимуществаНедостатки
Плагин возвратов (например, WooCommerce RMA)Готовое решение, поддержкаПлатно, ограниченная кастомизация
Кастомный тип поста с мета-полями (как в статье)Полный контроль, бесплатный, гибкийТребует разработки и поддержки
Использование комментариев к заказу для возвратовПростота реализацииМенее структурировано, сложно масштабировать
Как удалить неиспользуемые мета-данные в WordPress для ускорения сайта
09.12.2025
Как удалить пустые теги и атрибуты из HTML в WordPress
19.12.2025
Как добавить авторизацию через Google в WordPress
14.03.2026
Как использовать WPCommunity для создания приватных клубов на WordPress
31.03.2026
Как создать модульный код в WordPress для плагинов и тем
14.01.2026

Ниже мы подобрали самые актуальные материалы по Вордпресс