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

Диагностика задачи: зачем добавлять поле для серийного номера в корзине 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)Стандартный способ, лучше для обязательных данныхМожет усложнить оформление, не всегда удобно для серийных номеров
Использование сторонних плагинов для пользовательских полейБыстрый старт, визуальный конструкторДополнительная нагрузка, не всегда гибко, платные версии
Как создать автоподгрузку постов в WordPress без плагинов
22.02.2026
Как создать автоматические уведомления о обновлениях в WordPress
03.01.2026
WooCommerce: как добавить поле для ввода серийного номера товара в корзине
06.05.2026
WooCommerce: как автоматически удалять заказы по статусу и дате
04.05.2026
Как создать многоуровневую навигацию в WordPress
26.11.2025