WooCommerce — мощный инструмент для создания интернет-магазина на WordPress. Часто возникает задача добавить к товарам уникальные поля, которые помогут выделить продукт, добавить дополнительные характеристики, опции или просто собрать важную для продаж информацию. В этой статье рассмотрим, как добавить такие поля программно и с помощью популярных плагинов, а также как вывести их на странице товара и в заказах.
Почему нужны уникальные поля для товаров WooCommerce
Стандартный набор полей WooCommerce не всегда покрывает все требования бизнеса. Например, можно захотеть добавить:
- Нестандартные характеристики товара (например, номер серии, дата изготовления);
- Дополнительные опции, влияющие на цену или состав заказа;
- Поля для сбора информации от покупателя (например, гравировка, персонализация);
- Внутренние заметки или метки, видимые только администратору.
Уникальные поля позволяют гибко настраивать карточку товара и сбор информации, что улучшает опыт пользователя и упрощает работу с заказами.
Добавление уникальных полей программно
Добавление поля в админке товара
Чтобы добавить уникальное текстовое поле на страницу редактирования товара в админке WooCommerce, используем хук woocommerce_product_options_general_product_data. Например, создадим поле «Номер серии».
function wpboot_add_custom_general_fields() {
woocommerce_wp_text_input( array(
'id' => '_wpboot_serial_number',
'label' => __('Номер серии', 'wpboot'),
'desc_tip' => true,
'description' => __('Введите номер серии товара.', 'wpboot'),
'type' => 'text',
) );
}
add_action('woocommerce_product_options_general_product_data', 'wpboot_add_custom_general_fields');Этот код добавит поле в блок общих настроек товара.
Сохранение значения поля
Чтобы сохранить введённое значение, подключаемся к действию woocommerce_process_product_meta:
function wpboot_save_custom_general_fields($post_id) {
$serial_number = isset($_POST['_wpboot_serial_number']) ? sanitize_text_field($_POST['_wpboot_serial_number']) : '';
update_post_meta($post_id, '_wpboot_serial_number', $serial_number);
}
add_action('woocommerce_process_product_meta', 'wpboot_save_custom_general_fields');Вывод поля на странице товара
Чтобы показать значение номера серии на странице товара, используйте хук woocommerce_single_product_summary:
function wpboot_display_serial_number() {
global $product;
$serial_number = get_post_meta($product->get_id(), '_wpboot_serial_number', true);
if ($serial_number) {
echo '<p class="wpboot-serial-number"><strong>Номер серии:</strong> ' . esc_html($serial_number) . '</p>';
}
}
add_action('woocommerce_single_product_summary', 'wpboot_display_serial_number', 25);Этот код выведет номер серии после описания товара.
Использование плагинов для добавления уникальных полей
Если не хочется писать код, можно использовать популярные плагины, которые дают удобный интерфейс и расширенные возможности.
Advanced Custom Fields (ACF)
ACF — универсальный плагин для создания дополнительных полей в WordPress. Можно создать группу полей и привязать её к типу записи «product». Плагин позволяет создавать поля разных типов — текст, выбор, дата, изображение и т.д.
Преимущества ACF:
- Простой интерфейс настройки;
- Поддержка повторяющихся блоков;
- Возможность вывести поля в шаблонах через PHP код, например:
$serial_number = get_field('serial_number', $product_id);
echo 'Номер серии: ' . esc_html($serial_number);WooCommerce Custom Fields
Плагин специально для WooCommerce, позволяет добавлять поля в карточку товара, корзину, на страницу оформления заказа. Поддерживает различные типы полей и условия отображения.
Подходит для быстрого создания уникальных опций без программирования.
Отображение и использование уникальных полей в заказах
Если уникальные поля важны для обработки заказов, нужно вывести их в информации о заказе и на почте.
Добавление данных в заказ
Чтобы добавить данные поля в мета заказа при добавлении товара в корзину, используйте хук woocommerce_add_cart_item_data:
function wpboot_add_cart_item_data($cart_item_data, $product_id) {
$serial_number = get_post_meta($product_id, '_wpboot_serial_number', true);
if ($serial_number) {
$cart_item_data['wpboot_serial_number'] = $serial_number;
}
return $cart_item_data;
}
add_filter('woocommerce_add_cart_item_data', 'wpboot_add_cart_item_data', 10, 2);Отображение в корзине и заказе
Чтобы показать поле в корзине и в заказе, добавим фильтр:
function wpboot_display_cart_item_serial_number($item_data, $cart_item) {
if (isset($cart_item['wpboot_serial_number'])) {
$item_data[] = array(
'key' => __('Номер серии', 'wpboot'),
'value' => $cart_item['wpboot_serial_number'],
);
}
return $item_data;
}
add_filter('woocommerce_get_item_data', 'wpboot_display_cart_item_serial_number', 10, 2);Этот код выведет номер серии рядом с товаром в корзине и на странице оформления заказа.
Сохранение в мета заказа
Чтобы сохранить поле в мета заказа, используйте хук woocommerce_add_order_item_meta:
function wpboot_add_order_item_meta($item_id, $values) {
if (!empty($values['wpboot_serial_number'])) {
wc_add_order_item_meta($item_id, 'Номер серии', $values['wpboot_serial_number']);
}
}
add_action('woocommerce_add_order_item_meta', 'wpboot_add_order_item_meta', 10, 2);Рекомендации по безопасности и производительности
При работе с уникальными полями важно:
- Использовать функции санитайзинга, например,
sanitize_text_fieldдля текстовых данных; - Экранировать вывод через
esc_htmlили аналогичные функции, чтобы избежать XSS; - Не перегружать страницу товара большим количеством полей — учитывайте UX;
- Оптимизировать запросы к базе, использовать кэширование, если поля часто используются.
Заключение
Добавление уникальных полей в WooCommerce — мощный инструмент для кастомизации интернет-магазина под ваши нужды. Можно сделать это как вручную через код, так и с помощью проверенных плагинов. Главное — продумать, какие данные действительно нужны, и грамотно интегрировать их в процесс покупки и управления заказами.
Если хотите использовать готовые решения с расширенными возможностями, рекомендуем плагин WooCommerce Custom Fields на wpshop.ru. Он позволит быстро добавить нужные поля и гибко настроить их отображение без программирования.