В интернет-магазине на WooCommerce иногда возникает необходимость добавить дополнительный выбор для товара — например, выбор позиции, места расположения, варианта комплектации, отличного от стандартных атрибутов. Такой функционал полезен, если вы продаете, например, билеты на мероприятия с выбором места, мебель с выбором расположения или продукты с разными вариантами подачи.
Почему стандартных атрибутов WooCommerce может быть недостаточно
WooCommerce из коробки поддерживает атрибуты и вариации, однако их структура ориентирована на варианты с разным ценником и наличием. Если вам нужно просто добавить выбор позиции или опцию без создания вариаций, лучше добавить пользовательское поле с выбором.
Пользовательские поля позволяют гибко расширять функционал товара без усложнения вариаций и инвентаря. Кроме того, данные из пользовательских полей легко использовать в заказах и письмах.
Добавление выбора позиции с помощью плагина Advanced Custom Fields (ACF)
Самый простой способ — использовать бесплатный плагин Advanced Custom Fields. Он позволяет создавать удобный интерфейс выбора (select, radio) в админке товаров WooCommerce.
Инструкция:
- Устанавливаем и активируем ACF.
- Создаем новое поле типа «Выбор» (Select) или «Радио» (Radio Button), например с названием
position_choice. - Добавляем варианты выбора — например: «Верхняя полка», «Средняя полка», «Нижняя полка».
- В настройках группы полей указываем, что поле показывается для типа записи
product.
После сохранения в админке товара появится новый блок выбора позиции.
Отображение выбранной позиции на странице товара
Чтобы показывать выбранную позицию на странице товара, добавим в файл functions.php вашей темы или дочерней темы следующий код:
function wplancer_show_product_position() {
global $product;
$position = get_field('position_choice', $product->get_id());
if ($position) {
echo '<p><strong>Выбор позиции:</strong> ' . esc_html($position) . '</p>';
}
}
add_action('woocommerce_single_product_summary', 'wplancer_show_product_position', 25);Этот код выводит выбранное значение после названия и цены товара. Позицию можно оформить стилями по своему вкусу.
Сохранение выбора позиции при добавлении товара в корзину
Чтобы выбранная позиция передавалась в корзину и заказ, нужно добавить выбор на страницу товара и обработать его при добавлении в корзину:
Добавление поля выбора в форму добавления в корзину
function wplancer_add_position_field_to_product() {
global $product;
$position = get_field('position_choice', $product->get_id());
if (!$position) return;
$choices = get_field_object('position_choice', $product->get_id())['choices'];
echo '<label for="position_choice">Выберите позицию:</label><select name="position_choice" id="position_choice" required>';
foreach ($choices as $key => $label) {
echo '<option value="' . esc_attr($key) . '">' . esc_html($label) . '</option>';
}
echo '</select>';
}
add_action('woocommerce_before_add_to_cart_button', 'wplancer_add_position_field_to_product');Обработка и сохранение выбранного значения в корзине
function wplancer_add_position_to_cart_item($cart_item_data, $product_id) {
if (isset($_POST['position_choice'])) {
$cart_item_data['position_choice'] = sanitize_text_field($_POST['position_choice']);
$cart_item_data['unique_key'] = md5(microtime().rand()); // чтобы товары с разным выбором не слипались
}
return $cart_item_data;
}
add_filter('woocommerce_add_cart_item_data', 'wplancer_add_position_to_cart_item', 10, 2);Отображение позиции в корзине и заказе
function wplancer_display_position_cart($item_data, $cart_item) {
if (isset($cart_item['position_choice'])) {
$position_label = get_field_object('position_choice', $cart_item['product_id'])['choices'][$cart_item['position_choice']];
$item_data[] = array(
'key' => 'Позиция',
'value' => $position_label,
);
}
return $item_data;
}
add_filter('woocommerce_get_item_data', 'wplancer_display_position_cart', 10, 2);
function wplancer_add_position_order_item_meta($item, $cart_item_key, $values, $order) {
if (isset($values['position_choice'])) {
$position_label = get_field_object('position_choice', $values['product_id'])['choices'][$values['position_choice']];
$item->add_meta_data('Позиция', $position_label, true);
}
}
add_action('woocommerce_checkout_create_order_line_item', 'wplancer_add_position_order_item_meta', 10, 4);Альтернативный вариант — использовать плагин Custom Product Options
Если не хотите писать код, можно использовать плагин Custom Product Options, который позволяет добавлять любые поля выбора, текстовые, чекбоксы и т.д. прямо из админки WooCommerce с удобным интерфейсом.
Это особенно удобно, если позиций много и нужно гибко настраивать цены и зависимости.
Вывод
Добавление выбора позиции для товара в WooCommerce — частая задача, требующая гибкого подхода. Использование ACF и небольшого кода позволяет быстро реализовать функционал с сохранением данных в корзине и заказе. Плагин Custom Product Options подойдет тем, кто предпочитает полностью визуальное управление.
Такой подход расширит возможности вашего магазина и улучшит удобство выбора для покупателей.