Диагностика задачи: зачем добавлять поле для серийного номера в корзине WooCommerce
В интернет-магазинах, где продаются товары с уникальными серийными номерами (электроника, лицензии, оборудование), часто требуется, чтобы покупатель указал серийный номер при оформлении заказа. По умолчанию WooCommerce не предоставляет такое поле в корзине или на странице оформления заказа. В этой статье разберём, как добавить поле для ввода серийного номера в корзине, сохранить его в заказе и отобразить в админке и письмах.
Пошаговое решение: добавляем пользовательское поле для серийного номера в корзину
1. Добавляем поле ввода серийного номера в корзину
Для добавления поля в корзину используем хук woocommerce_after_cart_item_name. В этом поле покупатель сможет ввести серийный номер для каждого товара.
add_action('woocommerce_after_cart_item_name', 'add_serial_number_field_in_cart', 10, 2);
function add_serial_number_field_in_cart($cart_item, $cart_item_key) {
$serial_number = isset($cart_item['serial_number']) ? $cart_item['serial_number'] : '';
echo '<label>Серийный номер:</label> ';
echo '<input type="text" name="serial_number[' . esc_attr($cart_item_key) . ']" value="' . esc_attr($serial_number) . '" placeholder="Введите серийный номер" style="width:150px;" />';
}2. Обрабатываем и сохраняем данные из поля при обновлении корзины
Чтобы данные из поля сохранялись в сессии и не терялись при обновлении страницы, обрабатываем POST-запрос с помощью фильтра woocommerce_update_cart_action_cart_updated и обновляем данные в массиве корзины.
add_action('woocommerce_cart_updated', 'save_serial_number_field');
function save_serial_number_field() {
if (empty($_POST['serial_number']) || !is_array($_POST['serial_number'])) {
return;
}
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
if (isset($_POST['serial_number'][$cart_item_key])) {
$serial_number = sanitize_text_field($_POST['serial_number'][$cart_item_key]);
WC()->cart->cart_contents[$cart_item_key]['serial_number'] = $serial_number;
}
}
}3. Передаём серийный номер в заказ при оформлении
Для сохранения серийного номера в данных заказа используем хук woocommerce_checkout_create_order_line_item. Это позволит привязать серийный номер именно к каждой позиции заказа.
add_action('woocommerce_checkout_create_order_line_item', 'add_serial_number_to_order_items', 10, 4);
function add_serial_number_to_order_items($item, $cart_item_key, $values, $order) {
if (!empty($values['serial_number'])) {
$item->add_meta_data('Серийный номер', $values['serial_number'], true);
}
}Как проверить, что решение работает
- Добавьте товар в корзину и перейдите в корзину.
- Убедитесь, что рядом с названием товара появилось поле для ввода серийного номера.
- Впишите любой серийный номер и обновите корзину — поле должно сохранить значение.
- Оформите заказ, перейдите в админку WooCommerce, откройте детали заказа и проверьте, что в каждом товаре отображается введённый серийный номер как мета-данные.
- Проверьте письма с подтверждением заказа — при необходимости добавьте отображение мета-данных в письмо.
Частые ошибки и как их исправить
- Поле не сохраняет значение при обновлении корзины. Проверьте, правильно ли обрабатывается POST-параметр
serial_numberи вызывается лиWC()->cart->cart_contentsдля обновления значений. - Серийный номер не отображается в заказе. Убедитесь, что хук
woocommerce_checkout_create_order_line_itemподключён корректно и мета-данные добавляются через$item->add_meta_data. - Поле ввода появляется, но стили ломают верстку. Добавьте CSS для корректного отображения или используйте inline-стили с разумными размерами.
- Множественные товары в корзине с одинаковым ключом. Ключи корзины уникальны, но если используется нестандартная логика, проверьте, что для каждого товара создаётся своё поле с уникальным именем.
Практические советы по безопасности и производительности
- Всегда используйте
sanitize_text_field()для очистки пользовательского ввода. - Не сохраняйте в мета-данных чувствительные данные без шифрования.
- Минимизируйте количество выводимых полей в корзине, чтобы не замедлять загрузку страницы.
- Проверяйте совместимость с другими плагинами, которые модифицируют корзину или заказ.
Сравнение вариантов реализации поля серийного номера
| Метод | Плюсы | Минусы |
|---|---|---|
| Добавление поля в корзину через хуки | Простая реализация, контролируемый ввод, сохраняется в сессии | Требует доработки для отображения в письмах, возможны конфликты с другими плагинами |
| Добавление поля на странице оформления заказа (checkout) | Стандартный способ, лучше для обязательных данных | Может усложнить оформление, не всегда удобно для серийных номеров |
| Использование сторонних плагинов для пользовательских полей | Быстрый старт, визуальный конструктор | Дополнительная нагрузка, не всегда гибко, платные версии |