Диагностика задачи: зачем нужны пользовательские поля в корзине 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) | Редко | Удобно для полей на чекауте, не для корзины |