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

Диагностика задачи: зачем добавлять дополнительные поля в корзину 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']);    }}

Как проверить, что поле работает правильно

  1. Перейдите на страницу корзины, рядом с каждым товаром должен отображаться текстовый input с плейсхолдером.
  2. Введите значение в поле и нажмите кнопку "Обновить корзину".
  3. Поле должно сохранить введенное значение и повторно отображаться при обновлении страницы.
  4. Завершите оформление заказа и проверьте в админке 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, проще валидация и сохранение Не подходит, если поле нужно именно в корзине, не влияет на товары сразу
WooCommerce: как добавить дополнительные поля в заказ без плагинов
30.04.2026
WooCommerce: автоматическое изменение статуса заказа по успешному платежу
12.05.2026
Как создать визуальные таблицы в WordPress без кодирования
18.01.2026
Как отключить автоматическое обновление плагинов в WordPress
11.04.2026
WooCommerce: автоматическое удаление заказов при отказе оплаты
15.05.2026