Диагностика задачи: зачем и когда нужны дополнительные поля
Стандартные формы регистрации и оформления заказа WooCommerce часто не покрывают всех требований бизнеса. Например, может потребоваться собрать ИНН, дату рождения, согласие на обработку данных или дополнительные контакты. Добавление полей позволяет расширить функциональность магазина без привлечения плагинов, которые могут замедлять сайт или конфликтовать с другими компонентами.
Добавление дополнительных полей в форму регистрации WooCommerce
1. Добавление поля в HTML форму регистрации
Для начала нужно вывести дополнительное поле на страницу регистрации. Вставьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
add_action('woocommerce_register_form_start', 'add_custom_register_field');
function add_custom_register_field() {
?>
<p class="form-row form-row-wide">
<label for="reg_inn">ИНН <span class="required">*</span></label>
<input type="text" class="input-text" name="inn" id="reg_inn" value="<?php if (!empty($_POST['inn'])) echo esc_attr($_POST['inn']); ?>" />
</p>
<?php
}2. Проверка заполнения поля
Чтобы не пропускать пустые или ошибочные значения, добавьте валидацию:
add_filter('woocommerce_registration_errors', 'validate_custom_register_field', 10, 3);
function validate_custom_register_field($errors, $username, $email) {
if (empty($_POST['inn']) || !preg_match('/^\d{10,12}$/', $_POST['inn'])) {
$errors->add('inn_error', __('Пожалуйста, введите корректный ИНН (10-12 цифр).', 'woocommerce'));
}
return $errors;
}3. Сохранение дополнительного поля в метаданные пользователя
После успешной регистрации нужно сохранить ИНН в профиле пользователя:
add_action('woocommerce_created_customer', 'save_custom_register_field');
function save_custom_register_field($customer_id) {
if (!empty($_POST['inn'])) {
update_user_meta($customer_id, 'inn', sanitize_text_field($_POST['inn']));
}
}Добавление дополнительных полей в форму оформления заказа WooCommerce
1. Вывод дополнительных полей на страницу оформления
Добавим поле "ИНН" в раздел адреса для счетов:
add_filter('woocommerce_checkout_fields', 'add_custom_checkout_field');
function add_custom_checkout_field($fields) {
$fields['billing']['billing_inn'] = array(
'type' => 'text',
'label' => __('ИНН', 'woocommerce'),
'required' => true,
'class' => array('form-row-wide'),
'clear' => true,
'priority' => 110,
);
return $fields;
}2. Валидация поля на оформлении заказа
add_action('woocommerce_checkout_process', 'validate_custom_checkout_field');
function validate_custom_checkout_field() {
if (empty($_POST['billing_inn']) || !preg_match('/^\d{10,12}$/', $_POST['billing_inn'])) {
wc_add_notice(__('Пожалуйста, введите корректный ИНН (10-12 цифр).'), 'error');
}
}3. Сохранение и отображение поля в заказе
Сохраним ИНН в метаданных заказа и добавим его в админку:
add_action('woocommerce_checkout_update_order_meta', 'save_custom_checkout_field');
function save_custom_checkout_field($order_id) {
if (!empty($_POST['billing_inn'])) {
update_post_meta($order_id, '_billing_inn', sanitize_text_field($_POST['billing_inn']));
}
}
add_action('woocommerce_admin_order_data_after_billing_address', 'display_custom_checkout_field_admin_order', 10, 1);
function display_custom_checkout_field_admin_order($order){
$inn = get_post_meta($order->get_id(), '_billing_inn', true);
if ($inn) {
echo '<p><strong>ИНН:</strong> ' . esc_html($inn) . '</p>';
}
}Проверка результата после внедрения
- Откройте страницу регистрации: дополнительное поле ИНН должно отображаться.
- Попробуйте зарегистрироваться, оставив поле пустым или некорректным — должна появиться ошибка.
- Зарегистрируйтесь с корректным ИНН, затем проверьте в админке WordPress в профиле пользователя наличие мета-поля.
- Перейдите к оформлению заказа, убедитесь, что поле ИНН есть среди адресных данных.
- Попытайтесь оформить заказ с пустым или неправильным ИНН — получите ошибку.
- Завершите заказ с корректным ИНН и проверьте отображение этого значения в админке заказа.
Частые ошибки и как исправить
- Поле не отображается. Проверьте, что код добавлен в активную тему или плагин, нет синтаксических ошибок.
- Валидация не срабатывает. Убедитесь, что имя поля в
$_POSTсовпадает с указанным в форме. - Значение не сохраняется. Проверьте права пользователя и используйте корректные хуки
woocommerce_created_customerдля регистрации иwoocommerce_checkout_update_order_metaдля оформления заказа. - Ошибка XSS или некорректное отображение. Всегда используйте
esc_htmlиsanitize_text_fieldдля вывода и сохранения пользовательских данных.
Практические советы по безопасности и производительности
- Не используйте плагины для простого добавления полей, если задача ограничивается парой полей — код в теме быстрее и безопаснее.
- Для защиты от CSRF используйте стандартные nonce WooCommerce, если усложняете формы.
- Валидация должна проходить как на клиенте (JS), так и на сервере (PHP).
- Храните данные в пользовательских метах или метаполях заказа, не создавайте лишних таблиц.
Сравнение способов реализации
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Добавление полей через код в functions.php | Быстро, без сторонних плагинов, высокая производительность, контроль | Требует навыков PHP, возможность ошибок при некорректном коде | Малые и средние проекты, кастомизация под задачи |
| Плагины для кастомных полей | Удобство, визуальный интерфейс, расширенный функционал | Дополнительная нагрузка, возможные конфликты, зависимость от разработчика | Большие проекты, нестандартные требования, отсутствие навыков кодинга |