Диагностика задачи: зачем добавлять дополнительные поля в корзину WooCommerce
Частая задача для разработчиков WooCommerce — добавить кастомные поля в корзину для сбора дополнительной информации от покупателя (например, дату доставки, инструкции по упаковке, персонализацию товара и т.п.). Использование стандартных настроек не всегда позволяет гибко реализовать эти требования, поэтому приходится работать с хуками и фильтрами WooCommerce.
Перед началом убедитесь, что задача действительно требует именно полей в корзине, а не на странице оформления заказа (checkout). В корзине удобнее собирать данные, которые влияют на отображение товара или цену, а для сбора адресов и контактных данных лучше использовать checkout.
Какие хуки и фильтры нужны для добавления полей в корзину WooCommerce
Основные хуки для вставки дополнительных полей в корзину и их обработки:
woocommerce_after_cart_item_name— добавить HTML после названия товара в корзине;woocommerce_cart_item_name— фильтр для изменения названия товара и добавления к нему информации;woocommerce_before_calculate_totals— обработать и сохранить данные из полей перед подсчетом итогов корзины;woocommerce_update_cart_action_cart_updated— срабатывает после обновления корзины, можно валидировать и сохранить данные;woocommerce_get_cart_item_from_session— добавить сохраненные данные в объект корзины при загрузке сессии.
Пример: добавление текстового поля «Комментарий к товару» для каждого элемента корзины
Добавим поле ввода рядом с названием товара в корзине, сохраним его и отобразим в админке заказа.
Пошаговое решение
1. Вывод поля в шаблоне корзины
add_filter('woocommerce_cart_item_name', 'add_custom_field_to_cart_item_name', 10, 3); function add_custom_field_to_cart_item_name($product_name, $cart_item, $cart_item_key) { $custom_value = isset($cart_item['custom_comment']) ? $cart_item['custom_comment'] : ''; $field = '<input type="text" name="custom_comment[' . esc_attr($cart_item_key) . ']" value="' . esc_attr($custom_value) . '" placeholder="Комментарий к товару" style="margin-top:5px; width:100%;" />'; return $product_name . $field;}2. Сохранение данных при обновлении корзины
add_action('woocommerce_update_cart_action_cart_updated', 'save_custom_field_in_cart'); function save_custom_field_in_cart() { if (empty($_POST['custom_comment'])) return; foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) { if (isset($_POST['custom_comment'][$cart_item_key])) { WC()->cart->cart_contents[$cart_item_key]['custom_comment'] = sanitize_text_field($_POST['custom_comment'][$cart_item_key]); } }}3. Восстановление данных из сессии после перезагрузки
add_filter('woocommerce_get_cart_item_from_session', 'get_custom_field_from_session', 20, 2); function get_custom_field_from_session($cart_item, $values) { if (isset($values['custom_comment'])) { $cart_item['custom_comment'] = $values['custom_comment']; } return $cart_item;}4. Добавление данных в заказ для отображения в админке и email
add_action('woocommerce_checkout_create_order_line_item', 'add_custom_field_to_order_items', 10, 4); function add_custom_field_to_order_items($item, $cart_item_key, $values, $order) { if (isset($values['custom_comment']) && !empty($values['custom_comment'])) { $item->add_meta_data('Комментарий к товару', $values['custom_comment']); }}Как проверить, что поле работает правильно
- Перейдите на страницу корзины, рядом с каждым товаром должен отображаться текстовый input с плейсхолдером.
- Введите значение в поле и нажмите кнопку "Обновить корзину".
- Поле должно сохранить введенное значение и повторно отображаться при обновлении страницы.
- Завершите оформление заказа и проверьте в админке WooCommerce в деталях заказа наличие метаполя "Комментарий к товару" у каждого товара.
Частые ошибки и их исправление
- Поле не сохраняется после обновления корзины: убедитесь, что name поля содержит ключ корзины, и что обработчик
woocommerce_update_cart_action_cart_updatedкорректно обновляетWC()->cart->cart_contents. - Данные не сохраняются в сессии: обязательно используйте фильтр
woocommerce_get_cart_item_from_sessionдля восстановления данных и убедитесь, что ключи совпадают. - Поле не отображается в заказе: нужно добавить метаданные через хук
woocommerce_checkout_create_order_line_item, иначе данные пропадут. - Некорректное отображение поля: добавьте CSS-стили для поля, чтобы не ломать верстку корзины.
Практические советы по безопасности и производительности
- Обязательно используйте
sanitize_text_fieldили другие функции очистки данных перед сохранением, чтобы избежать XSS и других атак. - Не храните большие объемы данных в сессии корзины — это может замедлить загрузку страницы.
- Для сложных полей (например, файлы или сложные формы) лучше использовать checkout или отдельные плагины.
Сравнение вариантов реализации кастомных полей в корзине WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Добавление через хуки и фильтры (код) | Полный контроль, без сторонних плагинов, легковесно | Требует знаний PHP и WooCommerce API, больше ручной работы |
| Использование плагинов (например, WooCommerce Extra Product Options) | Быстро, готовые интерфейсы, часто поддержка сложных типов полей | Дополнительная нагрузка, может конфликтовать с темой, зависит от обновлений |
| Добавление полей на этапе оформления заказа (checkout) | Встроенные хуки WooCommerce, проще валидация и сохранение | Не подходит, если поле нужно именно в корзине, не влияет на товары сразу |