Что такое 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) | Готовое решение, поддержка | Платно, ограниченная кастомизация |
| Кастомный тип поста с мета-полями (как в статье) | Полный контроль, бесплатный, гибкий | Требует разработки и поддержки |
| Использование комментариев к заказу для возвратов | Простота реализации | Менее структурировано, сложно масштабировать |