Диагностика задачи: зачем нужно поле для серийного номера в корзине WooCommerce
В интернет-магазинах, продающих технику, электронику или лицензируемое ПО, часто требуется ввод серийного номера товара при оформлении заказа. WooCommerce по умолчанию не поддерживает такое поле в корзине, поэтому необходимо добавить собственное поле для ввода и сохранить данные с возможностью вывода в заказах и в админке.
Шаги для добавления поля серийного номера в корзине WooCommerce
1. Добавление поля ввода в корзину
Используем хук woocommerce_after_cart_item_name, чтобы отобразить поле ввода рядом с названием товара в корзине:
add_action('woocommerce_after_cart_item_name', 'add_serial_number_field_to_cart', 10, 2);
function add_serial_number_field_to_cart($cart_item, $cart_item_key) {
$serial_number = isset($cart_item['serial_number']) ? $cart_item['serial_number'] : '';
echo '<label for="serial_number_'.esc_attr($cart_item_key).'">Серийный номер:</label> ';
echo '<input type="text" name="serial_number['.esc_attr($cart_item_key).']" id="serial_number_'.esc_attr($cart_item_key).'" value="'.esc_attr($serial_number).'" style="width:150px;" />';
}2. Сохранение введённого серийного номера при обновлении корзины
Обрабатываем данные из формы корзины через хук woocommerce_cart_updated:
add_action('woocommerce_cart_updated', 'save_serial_number_field');
function save_serial_number_field() {
if ( ! isset($_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;
}
}
WC()->cart->set_session();
}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 ( isset($values['serial_number']) && ! empty($values['serial_number']) ) {
$item->add_meta_data('Серийный номер', $values['serial_number'], true);
}
}Проверка результата после внедрения
- Перейдите в корзину — рядом с каждым товаром должно появиться поле для ввода серийного номера.
- Впишите уникальный номер и обновите корзину, чтобы убедиться, что значение сохраняется.
- Оформите заказ и в админке WooCommerce перейдите к деталям заказа — в списке товаров должна отображаться мета-информация с серийным номером.
- Проверьте, что в письме покупателю или в PDF-счёте (если настроены) отображается серийный номер.
Частые ошибки и способы их исправления
- Поле не сохраняется при обновлении корзины
Проверьте, что в форме корзины присутствуетname="serial_number[...]"и что обработчик данных запускается на хукеwoocommerce_cart_updated. - Серийный номер не сохраняется в заказе
Убедитесь, что добавляете мета-данные вwoocommerce_checkout_create_order_line_item, а не в другие хуки. Проверьте, что ключ мета-данных уникален и корректно передаётся. - В поле отображается некорректное значение
Обязательно применяйтеesc_attr()для вывода значения, чтобы избежать проблем с HTML и XSS. - Данные не очищаются и остаются после удаления товара из корзины
Проверьте, что хранящиеся данные связаны с правильным ключом товара корзины и не сохраняются глобально.
Практические советы по безопасности и производительности
- Всегда используйте
sanitize_text_field()для очистки пользовательских вводов перед сохранением. - Не храните серийные номера в сессии или опциях — только в данных корзины и мета заказа.
- Если на сайте высокая нагрузка, кеширование страниц с корзиной должно быть отключено, чтобы новые данные вводились корректно.
- Для дополнительной валидации можно использовать JavaScript, чтобы предотвратить отправку пустых или некорректных значений.
Сравнение способов добавления поля серийного номера в WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Добавление поля через хуки корзины (код) | Полный контроль, нет лишних плагинов, легко кастомизировать | Нужно писать и тестировать код, требует навыков PHP | Если требуется кастомное поведение, минимизация плагинов |
| Использование плагина для кастомных полей WooCommerce | Быстро, без кода, поддержка и обновления | Может быть избыточным, влияет на производительность, меньше гибкости | Для пользователей без навыков программирования или быстрого запуска |