Как добавить дополнительное поле в форму регистрации WordPress с расширенными настройками

В стандартной форме регистрации WordPress доступно минимальное количество полей: имя пользователя, адрес электронной почты и пароль. Однако часто возникает необходимость расширить форму новыми полями, например, добавить выбор пола, дату рождения или согласие с правилами. В этой статье подробно разберем, как добавить дополнительное поле в форму регистрации, обработать его на сервере и сохранить данные, используя собственные префиксы функций для избежания конфликтов.

Почему стоит добавлять дополнительные поля в форму регистрации WordPress

Дополнительные поля позволяют собирать важную информацию о пользователях сразу при регистрации без необходимости последующей доработки профиля. Это актуально для сайтов с кастомными ролями, образовательных платформ, интернет-магазинов и сообществ. С помощью правильной реализации можно обеспечить валидацию, защиту от спама и удобный вывод данных в административной части.

Добавление поля в форму регистрации WordPress

Для начала используем хук register_form, который позволяет вставить HTML перед кнопкой регистрации. Создадим поле «Телефон» с классом и идентификатором для стилизации и валидации.

function wpapp_add_phone_field_to_registration() {
    $phone = isset($_POST['wpapp_phone']) ? esc_attr($_POST['wpapp_phone']) : '';
    echo '<p><label for="wpapp_phone">Телефон <span style="color:red;">*</span></label><br /><input type="text" name="wpapp_phone" id="wpapp_phone" class="input" value="' . $phone . '" size="25" /></p>';
}
add_action('register_form', 'wpapp_add_phone_field_to_registration');

Здесь мы выводим поле с сохранением введенного значения при ошибках регистрации.

Валидация дополнительного поля при регистрации

Чтобы проверить правильность заполнения поля и обязательность, используем хук registration_errors. Добавим проверку, что поле не пустое и содержит только цифры и символы +, -, пробел.

function wpapp_validate_phone_field($errors, $sanitized_user_login, $user_email) {
    if (empty($_POST['wpapp_phone'])) {
        $errors->add('wpapp_phone_error', '<strong>Ошибка</strong>: Пожалуйста, укажите телефон.');
    } else {
        $phone = trim($_POST['wpapp_phone']);
        if (!preg_match('/^[0-9+\-\s]+$/', $phone)) {
            $errors->add('wpapp_phone_error_format', '<strong>Ошибка</strong>: Телефон должен содержать только цифры, пробелы, + и -.');
        }
    }
    return $errors;
}
add_filter('registration_errors', 'wpapp_validate_phone_field', 10, 3);

Таким образом, если пользователь забудет заполнить поле или введет неверный формат, регистрация не пройдет, и выведется соответствующее сообщение.

Сохранение дополнительного поля в метаданные пользователя

После успешной регистрации нужно сохранить номер телефона в метаданные пользователя. Для этого используем хук user_register, который получает ID нового пользователя.

function wpapp_save_phone_field($user_id) {
    if (!empty($_POST['wpapp_phone'])) {
        update_user_meta($user_id, 'wpapp_phone', sanitize_text_field($_POST['wpapp_phone']));
    }
}
add_action('user_register', 'wpapp_save_phone_field');

Данные будут надежно сохранены и доступны для вывода в профиле и других местах.

Вывод дополнительного поля в административной панели WordPress

Чтобы администраторы могли видеть и редактировать добавленное поле, нужно расширить экран редактирования пользователя. Для вывода используем хуки show_user_profile и edit_user_profile:

function wpapp_show_phone_field_in_profile($user) {
    $phone = get_user_meta($user->ID, 'wpapp_phone', true);
    ?>
    <h2>Дополнительная информация</h2>
    <table class="form-table">
        <tr>
            <th><label for="wpapp_phone">Телефон</label></th>
            <td>
                <input type="text" name="wpapp_phone" id="wpapp_phone" value="<?php echo esc_attr($phone); ?>" class="regular-text" />
            </td>
        </tr>
    </table>
    <?php
}
add_action('show_user_profile', 'wpapp_show_phone_field_in_profile');
add_action('edit_user_profile', 'wpapp_show_phone_field_in_profile');

Для сохранения введенного значения добавим обработчик на хуки personal_options_update и edit_user_profile_update:

function wpapp_save_phone_field_in_profile($user_id) {
    if (!current_user_can('edit_user', $user_id)) {
        return false;
    }
    if (isset($_POST['wpapp_phone'])) {
        update_user_meta($user_id, 'wpapp_phone', sanitize_text_field($_POST['wpapp_phone']));
    }
}
add_action('personal_options_update', 'wpapp_save_phone_field_in_profile');
add_action('edit_user_profile_update', 'wpapp_save_phone_field_in_profile');

Дополнительные советы по реализации и безопасности

1. Используйте уникальные префиксы для функций и мета-ключей, чтобы избежать конфликтов с другими плагинами.
2. Всегда применяйте функции очистки данных, такие как sanitize_text_field и esc_attr, чтобы предотвратить XSS и другие уязвимости.
3. При необходимости добавьте защиту reCAPTCHA или аналогичные меры для защиты от спама.
4. Можно интегрировать дополнительное поле с плагинами, например, для отправки SMS-уведомлений или проверки телефона через API.
5. Для быстрого старта можно использовать плагин Clearfy, который позволяет настраивать формы и оптимизировать работу сайта.

Заключение

Добавление дополнительных полей в форму регистрации WordPress — задача, которую можно решить с минимальными знаниями PHP и хуков WordPress. Представленные примеры кода показывают, как расширить стандартную форму, обеспечить валидацию, сохранить данные и вывести их в админке. Это позволит собрать необходимую информацию о пользователях прямо при регистрации без установки громоздких плагинов.

Наш каталог плагинов WordPress