WooCommerce: как добавить дополнительные поля в форму регистрации пользователя

Диагностика задачи: зачем нужны дополнительные поля в форме регистрации 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)Быстрая настройка, визуальный интерфейс, поддержкаМожет замедлить сайт, ограниченная кастомизация, необходимость лицензии
Изменение шаблонов темыПолный контроль над интерфейсомСложно поддерживать, риск конфликтов при обновлениях темы
WooCommerce: установка и использование хуков для дополнительной обработки заказов
18.05.2026
Как удалить дубликаты постов в WordPress
30.11.2025
WooCommerce: как автоматически удалять заказы по статусу и дате
01.05.2026
WooCommerce: как добавить отложенную оплату для заказов
21.04.2026
WooCommerce: автоматическое удаление заказов по статусу и дате
07.07.2026