Стандартная форма регистрации WordPress включает только несколько базовых полей: имя пользователя, email и пароль. Однако в ряде случаев бывает необходимо собрать дополнительную информацию от пользователей, например, их телефон, дату рождения или согласие с условиями. В этой статье разберем, как добавить собственные поля в форму регистрации WordPress, обработать их и сохранить данные в профиль пользователя.
Почему стоит добавлять дополнительные поля в форму регистрации WordPress
Дополнительные поля помогают лучше понять аудиторию, сегментировать пользователей и собирать важные данные для работы сайта. Например, если у вас сайт с обучающими курсами, может понадобиться поле для выбора интересующей темы или уровня подготовки. В интернет-магазинах полезно добавить поле с номером телефона для быстрой связи.
Добавление полей вручную без плагинов дает полный контроль над процессом и не загружает сайт лишними модулями. Однако для сложных форм и валидаций стоит рассмотреть плагины.
Добавление кастомного поля в форму регистрации WordPress: пошаговое руководство
Рассмотрим на примере, как добавить поле «Телефон» в стандартную форму регистрации, проверить его заполнение и сохранить в базе данных.
1. Вывод дополнительного поля в форме регистрации
Для добавления поля используем хук register_form. В функции выведем HTML с input:
function wpfaq_add_phone_field() {
$phone = ( ! empty( $_POST['wpfaq_phone'] ) ) ? sanitize_text_field( $_POST['wpfaq_phone'] ) : '';
echo '<p><label for="phone">Телефон <span class="required">*</span></label><br />';
echo '<input type="text" name="wpfaq_phone" id="phone" class="input" value="' . esc_attr( $phone ) . '" size="25" /></p>';
}
add_action('register_form', 'wpfaq_add_phone_field');
Здесь мы добавили поле с именем wpfaq_phone. Обратите внимание на префикс функции и поля — чтобы избежать конфликтов, используйте уникальные имена.
2. Валидация поля при регистрации
Чтобы убедиться, что пользователь ввел телефон, используем хук registration_errors:
function wpfaq_validate_phone_field( $errors, $sanitized_user_login, $user_email ) {
if ( empty( $_POST['wpfaq_phone'] ) || ! preg_match( '/^\+?[0-9\-\s]{7,15}$/', $_POST['wpfaq_phone'] ) ) {
$errors->add( 'wpfaq_phone_error', '<strong>Ошибка</strong>: Пожалуйста, введите корректный номер телефона.' );
}
return $errors;
}
add_filter('registration_errors', 'wpfaq_validate_phone_field', 10, 3);
Здесь мы проверяем, что поле не пустое и соответствует простому регулярному выражению для телефона. В реальном проекте регулярку можно улучшить под нужный формат.
3. Сохранение значения поля в профиль пользователя
После успешной регистрации добавим номер телефона в метаданные пользователя через хук user_register:
function wpfaq_save_phone_field( $user_id ) {
if ( ! empty( $_POST['wpfaq_phone'] ) ) {
update_user_meta( $user_id, 'wpfaq_phone', sanitize_text_field( $_POST['wpfaq_phone'] ) );
}
}
add_action('user_register', 'wpfaq_save_phone_field');
Теперь номер телефона сохранится и будет доступен в профиле пользователя.
Отображение и редактирование дополнительного поля в профиле пользователя
Чтобы администраторы могли видеть и менять телефон, добавим поле в админку:
function wpfaq_show_phone_field_in_profile( $user ) {
$phone = get_user_meta( $user->ID, 'wpfaq_phone', true );
?>
<h3>Дополнительная информация</h3>
<table class="form-table">
<tr>
<th><label for="wpfaq_phone">Телефон</label></th>
<td>
<input type="text" name="wpfaq_phone" id="wpfaq_phone" value="<?php echo esc_attr( $phone ); ?>" class="regular-text" />
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'wpfaq_show_phone_field_in_profile' );
add_action( 'edit_user_profile', 'wpfaq_show_phone_field_in_profile' );
function wpfaq_save_phone_field_in_profile( $user_id ) {
if ( current_user_can( 'edit_user', $user_id ) && ! empty( $_POST['wpfaq_phone'] ) ) {
update_user_meta( $user_id, 'wpfaq_phone', sanitize_text_field( $_POST['wpfaq_phone'] ) );
}
}
add_action( 'personal_options_update', 'wpfaq_save_phone_field_in_profile' );
add_action( 'edit_user_profile_update', 'wpfaq_save_phone_field_in_profile' );
Так администратор и сам пользователь смогут управлять этим полем.
Использование плагинов для добавления дополнительных полей в регистрацию
Если вы не хотите писать код или нужны сложные формы, можно использовать готовые плагины:
- User Registration — бесплатный плагин с удобным конструктором форм, поддержкой кастомных полей и интеграцией с email-сервисами.
- Profile Builder — позволяет создавать любые формы регистрации и редактирования профиля с кастомными полями.
- WP User Manager — мощный плагин для управления пользователями и расширения форм регистрации.
Все они имеют визуальные редакторы и позволяют создавать поля без кода, но для тонкой настройки и производительности часто удобнее писать свои решения.
Советы по безопасности и удобству при добавлении новых полей
При добавлении кастомных полей обязательно выполняйте валидацию и санитизацию данных — это поможет избежать XSS и SQL-инъекций. Используйте функции sanitize_text_field, esc_attr и проверяйте формат с помощью регулярных выражений.
Не забывайте про локализацию текста, если сайт многоязычный — оборачивайте строки в функции __() и _e().
Также учитывайте удобство пользователей: добавьте подсказки, примеры заполнения и помечайте обязательные поля.
Пример полного кода для добавления поля «Телефон» в регистрацию WordPress
<?php
// Вывод поля в форме регистрации
function wpfaq_add_phone_field() {
$phone = ( ! empty( $_POST['wpfaq_phone'] ) ) ? sanitize_text_field( $_POST['wpfaq_phone'] ) : '';
echo '<p><label for="phone">Телефон <span class="required">*</span></label><br />';
echo '<input type="text" name="wpfaq_phone" id="phone" class="input" value="' . esc_attr( $phone ) . '" size="25" /></p>';
}
add_action('register_form', 'wpfaq_add_phone_field');
// Валидация поля
function wpfaq_validate_phone_field( $errors, $sanitized_user_login, $user_email ) {
if ( empty( $_POST['wpfaq_phone'] ) || ! preg_match( '/^\+?[0-9\-\s]{7,15}$/', $_POST['wpfaq_phone'] ) ) {
$errors->add( 'wpfaq_phone_error', '<strong>Ошибка</strong>: Пожалуйста, введите корректный номер телефона.' );
}
return $errors;
}
add_filter('registration_errors', 'wpfaq_validate_phone_field', 10, 3);
// Сохранение данных
function wpfaq_save_phone_field( $user_id ) {
if ( ! empty( $_POST['wpfaq_phone'] ) ) {
update_user_meta( $user_id, 'wpfaq_phone', sanitize_text_field( $_POST['wpfaq_phone'] ) );
}
}
add_action('user_register', 'wpfaq_save_phone_field');
// Отображение поля в профиле
function wpfaq_show_phone_field_in_profile( $user ) {
$phone = get_user_meta( $user->ID, 'wpfaq_phone', true );
?>
<h3>Дополнительная информация</h3>
<table class="form-table">
<tr>
<th><label for="wpfaq_phone">Телефон</label></th>
<td>
<input type="text" name="wpfaq_phone" id="wpfaq_phone" value="<?php echo esc_attr( $phone ); ?>" class="regular-text" />
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'wpfaq_show_phone_field_in_profile' );
add_action( 'edit_user_profile', 'wpfaq_show_phone_field_in_profile' );
// Сохранение поля из профиля
function wpfaq_save_phone_field_in_profile( $user_id ) {
if ( current_user_can( 'edit_user', $user_id ) && ! empty( $_POST['wpfaq_phone'] ) ) {
update_user_meta( $user_id, 'wpfaq_phone', sanitize_text_field( $_POST['wpfaq_phone'] ) );
}
}
add_action( 'personal_options_update', 'wpfaq_save_phone_field_in_profile' );
add_action( 'edit_user_profile_update', 'wpfaq_save_phone_field_in_profile' );
?>
Этот код можно добавить в файл functions.php вашей темы или оформить отдельным мини-плагином.
Заключение
Добавление дополнительных полей в форму регистрации WordPress позволяет гибко собирать нужные данные от пользователей. Вручную это делается с помощью хуков register_form, registration_errors и user_register. Для удобства администрирования полезно вывести поля в профиле пользователя. При необходимости стоит использовать готовые плагины с визуальными конструкторами.
Если хотите расширить функционал еще проще и без кода, обратите внимание на плагины из репозитория WordPress или продукты с сайта WPSHOP.RU, где есть решения для управления формами и профилями.