В стандартной форме регистрации WordPress доступны только базовые поля: имя пользователя, email и пароль. Но довольно часто требуется расширить форму регистрации дополнительными полями — например, добавить поле для номера телефона, города или согласия с правилами. В этой статье подробно разберём, как добавить дополнительные поля в форму регистрации WordPress, сохранить данные и вывести их в админке.
Почему стоит добавлять собственные поля регистрации
Стандартная форма регистрации очень ограничена. Если вы хотите собрать больше информации о пользователях, настроить сайт под их нужды, или интегрировать регистрацию с внешними сервисами, дополнительные поля просто необходимы. Например, поле «Номер телефона» позволит связываться с клиентом, а чекбокс «Подписка на новости» — управлять рассылками.
Добавление полей стоит делать аккуратно, чтобы не ухудшить удобство регистрации и не создавать излишних барьеров для пользователя.
Добавление полей в форму регистрации WordPress
Для начала добавим новые поля в форму регистрации. Мы воспользуемся хуком register_form, который позволяет выводить дополнительные поля в форме.
function wplab_add_registration_fields() {
?>
<p>
<label for="phone"><?php _e('Номер телефона', 'wplab'); ?><br />
<input type="text" name="phone" id="phone" class="input" value="<?php echo esc_attr(wp_unslash($_POST['phone'] ?? '')); ?>" size="25" /></label>
</p>
<p>
<label for="city"><?php _e('Город', 'wplab'); ?><br />
<input type="text" name="city" id="city" class="input" value="<?php echo esc_attr(wp_unslash($_POST['city'] ?? '')); ?>" size="25" /></label>
</p>
<?php
}
add_action('register_form', 'wplab_add_registration_fields');В этом коде мы добавили два поля: «Номер телефона» и «Город». Функция esc_attr и wp_unslash защищают от XSS и корректно выводят введённые пользователем данные при ошибке.
Валидация и проверка дополнительных полей
Важно проверить, чтобы пользователь корректно заполнил новые поля. Для этого используем хук registration_errors, который позволяет добавить собственные ошибки регистрации.
function wplab_validate_registration_fields($errors, $sanitized_user_login, $user_email) {
if (empty($_POST['phone']) || !preg_match('/^[+\d\s\-]{7,15}$/', $_POST['phone'])) {
$errors->add('phone_error', __('<strong>Ошибка</strong>: пожалуйста, введите корректный номер телефона.', 'wplab'));
}
if (empty($_POST['city'])) {
$errors->add('city_error', __('<strong>Ошибка</strong>: поле «Город» обязательно для заполнения.', 'wplab'));
}
return $errors;
}
add_filter('registration_errors', 'wplab_validate_registration_fields', 10, 3);Здесь проверяется, что номер телефона соответствует регулярному выражению, разрешающему цифры, пробелы, плюсы и дефисы в диапазоне от 7 до 15 символов. Для поля «Город» просто проверяем, что оно не пустое.
Сохранение данных дополнительных полей пользователя
После успешной регистрации необходимо сохранить новые данные в метаполе пользователя. Для этого используем хук user_register.
function wplab_save_registration_fields($user_id) {
if (!empty($_POST['phone'])) {
update_user_meta($user_id, 'phone', sanitize_text_field($_POST['phone']));
}
if (!empty($_POST['city'])) {
update_user_meta($user_id, 'city', sanitize_text_field($_POST['city']));
}
}
add_action('user_register', 'wplab_save_registration_fields');Функция sanitize_text_field очищает данные от нежелательных символов, что важно для безопасности.
Вывод дополнительных полей в профиле пользователя
Часто нужно, чтобы администратор мог видеть и редактировать эти поля в профиле пользователя в админке. Для этого добавим поля в форму профиля с помощью хуков show_user_profile и edit_user_profile.
function wplab_show_extra_profile_fields($user) {
?>
<h3><?php _e('Дополнительная информация', 'wplab'); ?></h3>
<table class="form-table">
<tr>
<th><label for="phone"><?php _e('Номер телефона', 'wplab'); ?></label></th>
<td>
<input type="text" name="phone" id="phone" value="<?php echo esc_attr(get_user_meta($user->ID, 'phone', true)); ?>" class="regular-text" /><br />
<span class="description"><?php _e('Введите номер телефона пользователя.', 'wplab'); ?></span>
</td>
</tr>
<tr>
<th><label for="city"><?php _e('Город', 'wplab'); ?></label></th>
<td>
<input type="text" name="city" id="city" value="<?php echo esc_attr(get_user_meta($user->ID, 'city', true)); ?>" class="regular-text" /><br />
<span class="description"><?php _e('Введите город пользователя.', 'wplab'); ?></span>
</td>
</tr>
</table>
<?php
}
add_action('show_user_profile', 'wplab_show_extra_profile_fields');
add_action('edit_user_profile', 'wplab_show_extra_profile_fields');Сохранение данных из профиля пользователя в админке
Чтобы сохранить изменения, сделанные администратором, используем хуки personal_options_update и edit_user_profile_update.
function wplab_save_extra_profile_fields($user_id) {
if (!current_user_can('edit_user', $user_id)) {
return false;
}
if (isset($_POST['phone'])) {
update_user_meta($user_id, 'phone', sanitize_text_field($_POST['phone']));
}
if (isset($_POST['city'])) {
update_user_meta($user_id, 'city', sanitize_text_field($_POST['city']));
}
}
add_action('personal_options_update', 'wplab_save_extra_profile_fields');
add_action('edit_user_profile_update', 'wplab_save_extra_profile_fields');Использование дополнительных полей в шаблонах и плагинах
Теперь, когда данные сохранены, можно выводить их на сайте, например, в шаблоне профиля пользователя:
$phone = get_user_meta(get_current_user_id(), 'phone', true);
echo 'Ваш номер телефона: ' . esc_html($phone);Или использовать в условных проверках, рассылках, интеграциях с CRM и т.п.
Плагины для расширения регистрации с дополнительными полями
Если не хочется писать код, можно использовать плагины. Например:
- Profile Builder — мощный конструктор форм регистрации и профиля.
- User Registration — простой и удобный плагин с поддержкой множества полей.
- Clearfy Pro — среди прочих возможностей, упрощает управление полями регистрации и авторизации.
Но в ряде случаев собственный код будет предпочтительнее — это легче контролировать, оптимизировать и интегрировать под задачи.