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

Диагностика задачи: зачем нужны пользовательские поля в корзине WooCommerce

В стандартной корзине WooCommerce отсутствует возможность собирать дополнительные данные от покупателей, например, комментарии к заказу, особые инструкции или выбор дополнительных опций. Добавление пользовательских полей позволяет расширить функционал магазина без изменения ядра WooCommerce и не требует установки громоздких плагинов.

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

Для добавления пользовательских полей в корзину используются хуки, которые позволяют вывести HTML, а также обработать и сохранить данные:

  • woocommerce_after_cart_table — вывод полей после таблицы корзины;
  • woocommerce_cart_updated — обработка обновления корзины и валидация;
  • woocommerce_checkout_create_order — сохранение данных из корзины в заказ;
  • woocommerce_get_item_data — отображение данных в корзине и на странице оформления заказа.

Пошаговое решение с примером кода

1. Добавляем поле на страницу корзины

add_action('woocommerce_after_cart_table', 'add_custom_textarea_to_cart');
function add_custom_textarea_to_cart() {
    $value = isset(WC()->session->get('custom_cart_field')) ? WC()->session->get('custom_cart_field') : '';
    echo '<tr class="custom-cart-field"><td colspan="6">';
    echo '<label for="custom_cart_field">Дополнительные инструкции для заказа:</label><br>';
    echo '<textarea name="custom_cart_field" id="custom_cart_field" rows="4" cols="50">' . esc_textarea($value) . '</textarea>';
    echo '</td></tr>';
}

2. Обрабатываем отправку данных при обновлении корзины

add_action('woocommerce_cart_updated', 'save_custom_cart_field');
function save_custom_cart_field() {
    if (isset($_POST['custom_cart_field'])) {
        $custom_field = sanitize_textarea_field($_POST['custom_cart_field']);
        WC()->session->set('custom_cart_field', $custom_field);
    }
}

3. Добавляем данные из сессии в каждую позицию заказа

add_action('woocommerce_checkout_create_order', 'add_custom_field_to_order_items', 20, 2);
function add_custom_field_to_order_items($order, $data) {
    $custom_field = WC()->session->get('custom_cart_field');
    if (!empty($custom_field)) {
        foreach ($order->get_items() as $item_id => $item) {
            $item->add_meta_data('Дополнительные инструкции', $custom_field, true);
        }
    }
}

4. Отображаем пользовательские данные в корзине и на странице оформления заказа

add_filter('woocommerce_get_item_data', 'display_custom_cart_field_in_cart', 10, 2);
function display_custom_cart_field_in_cart($item_data, $cart_item) {
    $custom_field = WC()->session->get('custom_cart_field');
    if (!empty($custom_field)) {
        $item_data[] = array(
            'key' => 'Дополнительные инструкции',
            'value' => wp_kses_post($custom_field)
        );
    }
    return $item_data;
}

Проверка результата

  • Перейдите в корзину WooCommerce, убедитесь, что поле "Дополнительные инструкции для заказа" отображается под списком товаров.
  • Введите текст и обновите корзину — поле должно сохранять введённые данные.
  • Перейдите к оформлению заказа — дополнительная информация должна отображаться в деталях заказа и на странице администратора.
  • Проверьте в админке в деталях заказа, что пользовательские инструкции сохранены в метаданных каждого товара.

Частые ошибки и способы их устранения

  • Данные не сохраняются после обновления корзины. Проверьте, что в обработчике woocommerce_cart_updated правильно используете WC()->session->set() и не забываете санитизацию.
  • Поле не отображается на странице корзины. Убедитесь, что хук woocommerce_after_cart_table подключён правильно и функция не вызывает ошибок PHP.
  • Данные не передаются в заказ. Проверьте, что функция сохранения вызывается на хуке woocommerce_checkout_create_order с правильными параметрами.
  • Отображение данных некорректное (HTML в тексте). Используйте функции esc_textarea() и wp_kses_post() для защиты и корректного вывода.

Практические советы по производительности и безопасности

  • Используйте сессии WooCommerce (WC()->session) для временного хранения данных, чтобы избежать нагрузки на базу при каждом обновлении.
  • Обязательно фильтруйте и санитизируйте пользовательский ввод (sanitize_textarea_field()), чтобы избежать XSS-уязвимостей.
  • Для больших магазинов с многоуровневыми корзинами лучше хранить данные в метаданных товаров, а не в сессии, чтобы избежать потери данных.
  • Тестируйте совместимость с кеширующими плагинами, так как они могут кэшировать страницу корзины без учёта динамических полей.

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

МетодПлагинКодКомпромисс
Плагин Advanced Custom Fields + доп. плагин для WooCommerceДаНетЛегко, но плагинов много, нагрузка
Использование хуков WooCommerce (как в статье)НетДаГибко, но требует знаний PHP и тестирования
Пользовательские поля в оформлении заказаДа (например, Checkout Field Editor)РедкоУдобно для полей на чекауте, не для корзины

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как использовать хуки для оптимизации WordPress: практические примеры
06.12.2025
WooCommerce: как исправить повышенное время отклика корзины при массовом обновлении заказов
21.05.2026
Как удалить кэш в WordPress при изменении шаблонов: практические решения
09.12.2025
Как создать подробный лог авторизации в WordPress с примерами кода
20.02.2026
Как создать пользовательскую роль в WordPress с примерами кода
12.12.2025
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее