Диагностика задачи: зачем нужны дополнительные поля в форме регистрации WooCommerce
Стандартная форма регистрации WooCommerce содержит минимум полей: имя пользователя, адрес электронной почты и пароль. В реальных проектах часто требуется собирать дополнительную информацию — например, номер телефона, ИНН, дату рождения или согласие с политикой конфиденциальности. Без доработки это невозможно, так как WooCommerce не предоставляет визуальных настроек для расширения формы регистрации.
Пошаговое решение: добавление и сохранение дополнительных полей в форме регистрации WooCommerce
1. Добавление новых полей на страницу регистрации
Используем хук woocommerce_register_form для вывода дополнительных полей перед кнопкой регистрации. Например, добавим поле «Телефон» и чекбокс согласия:
add_action('woocommerce_register_form', 'custom_woocommerce_register_form_fields');
function custom_woocommerce_register_form_fields() {
?>
<p class="form-row form-row-wide">
<label for="reg_billing_phone"><?php esc_html_e('Телефон', 'woocommerce'); ?> <span class="required">*</span></label>
<input type="tel" class="input-text" name="billing_phone" id="reg_billing_phone" value="<?php if (!empty($_POST['billing_phone'])) echo esc_attr($_POST['billing_phone']); ?>" />
</p>
<p class="form-row form-row-wide">
<label class="woocommerce-form__label woocommerce-form__label-for-checkbox checkbox">
<input class="woocommerce-form__input woocommerce-form__input-checkbox input-checkbox" name="privacy_policy" type="checkbox" id="privacy_policy" />
<span><?php esc_html_e('Я согласен с политикой конфиденциальности', 'woocommerce'); ?> <span class="required">*</span></span>
</label>
</p>
<?php
}2. Валидация введённых данных
Для проверки обязательности полей и корректности данных используем хук woocommerce_registration_errors. Например:
add_filter('woocommerce_registration_errors', 'custom_validate_registration_fields', 10, 3);
function custom_validate_registration_fields($errors, $username, $email) {
if (empty($_POST['billing_phone'])) {
$errors->add('billing_phone_error', __('Пожалуйста, введите телефон.', 'woocommerce'));
} elseif (!preg_match('/^\+?[0-9]{10,15}$/', $_POST['billing_phone'])) {
$errors->add('billing_phone_error', __('Введите корректный номер телефона.', 'woocommerce'));
}
if (empty($_POST['privacy_policy'])) {
$errors->add('privacy_policy_error', __('Вы должны согласиться с политикой конфиденциальности.', 'woocommerce'));
}
return $errors;
}3. Сохранение дополнительных данных в мета-поля пользователя
После успешной регистрации данные из формы нужно сохранить. Для этого используем хук woocommerce_created_customer:
add_action('woocommerce_created_customer', 'custom_save_registration_fields');
function custom_save_registration_fields($customer_id) {
if (isset($_POST['billing_phone'])) {
update_user_meta($customer_id, 'billing_phone', sanitize_text_field($_POST['billing_phone']));
}
}4. Отображение и редактирование этих данных в личном кабинете
Чтобы пользователь мог видеть и менять эти поля, нужно добавить их в форму редактирования аккаунта. Пример вывода поля телефона:
add_action('woocommerce_edit_account_form', 'custom_show_account_phone_field');
function custom_show_account_phone_field() {
$user_id = get_current_user_id();
$phone = get_user_meta($user_id, 'billing_phone', true);
?>
<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
<label for="account_billing_phone"><?php esc_html_e('Телефон', 'woocommerce'); ?></label>
<input type="tel" class="woocommerce-Input woocommerce-Input--text input-text" name="account_billing_phone" id="account_billing_phone" value="<?php echo esc_attr($phone); ?>" />
</p>
<?php
}
add_action('woocommerce_save_account_details', 'custom_save_account_phone_field');
function custom_save_account_phone_field($user_id) {
if (isset($_POST['account_billing_phone'])) {
update_user_meta($user_id, 'billing_phone', sanitize_text_field($_POST['account_billing_phone']));
}
}Проверка результата после внедрения
- Перейдите на страницу регистрации WooCommerce и убедитесь, что новые поля отображаются.
- Попробуйте зарегистрироваться без заполнения новых полей — должны появиться ошибки валидации.
- Успешно зарегистрируйтесь с корректными данными, затем в админке WordPress проверьте, что пользователь имеет мета-данные
billing_phone. - Зайдите в личный кабинет пользователя, проверьте, что поле с телефоном доступно и сохраняется после изменения.
Частые ошибки и способы их исправления
- Поля не сохраняются после регистрации: проверьте, что функция сохранения подключена к хуку
woocommerce_created_customerи что данные передаются через$_POSTс правильными именами. - Ошибка валидации не выводится: убедитесь, что в фильтре
woocommerce_registration_errorsвы добавляете ошибки через объектWP_Errorи возвращаете его. - Поля не отображаются в личном кабинете: проверьте, что хуки
woocommerce_edit_account_formиwoocommerce_save_account_detailsподключены и функции корректно работают. - Номер телефона не проходит проверку: обновите регулярное выражение для валидации под нужный формат, например, учитывайте международный формат.
Практические советы по безопасности и производительности
- Всегда используйте функции
sanitize_text_field()иesc_attr()для очистки и вывода данных, чтобы избежать XSS и инъекций. - Не храните чувствительные данные в открытом виде, если добавляете более приватную информацию — подумайте о шифровании или использовании защищённых мета-полей.
- Минимизируйте количество дополнительных полей, чтобы не усложнять форму и не снижать конверсию регистрации.
- Для масштабных изменений и поддержки удобства лучше оформлять такие доработки в виде отдельного плагина, чтобы не потерять изменения при обновлении темы или WooCommerce.
Сравнение вариантов реализации
| Метод | Преимущества | Недостатки |
|---|---|---|
| Добавление через хуки WooCommerce (код) | Гибкость, отсутствие зависимостей, контроль над валидацией и сохранением | Требует навыков PHP, возможны ошибки при обновлениях WooCommerce |
| Использование плагинов (например, WooCommerce Checkout Field Editor) | Быстрая настройка, визуальный интерфейс, поддержка | Может замедлить сайт, ограниченная кастомизация, необходимость лицензии |
| Изменение шаблонов темы | Полный контроль над интерфейсом | Сложно поддерживать, риск конфликтов при обновлениях темы |