В стандартной форме регистрации WordPress по умолчанию доступно минимальное количество полей: имя пользователя, email и пароль. Часто возникает необходимость добавить дополнительные поля, чтобы собирать больше информации о пользователях при регистрации. В этой статье мы подробно разберём, как добавить своё поле в форму регистрации WordPress, используя хуки, а также как валидировать и сохранять эти данные, чтобы они корректно отображались в профиле пользователя.
Почему важно использовать хуки для добавления полей в регистрацию
Использование хуков — это нативный, гибкий и безопасный способ изменить стандартное поведение WordPress без правки исходных файлов ядра. Мы будем использовать следующие хуки:
register_form— для добавления HTML-поля в форму регистрации.registration_errors— для валидации введённых пользователем данных.user_register— для сохранения дополнительной информации в метаданные пользователя.
Такой подход гарантирует, что добавленное поле будет работать с любыми темами и совместимыми плагинами, а также обновляться вместе с WordPress без проблем.
Добавление дополнительного поля в форму регистрации
Начнём с добавления поля «Телефон» в форму регистрации. Для этого добавим код в файл functions.php вашей темы или в отдельный плагин:
function wproot_add_phone_field() {
$phone = ( isset( $_POST['wproot_phone'] ) ) ? sanitize_text_field( $_POST['wproot_phone'] ) : '';
echo '<p>'
. '<label for="wproot_phone">Телефон <span class="required">*</span></label>'
. '<input type="text" name="wproot_phone" id="wproot_phone" class="input" value="' . esc_attr( $phone ) . '" size="25" />'
. '</p>';
}
add_action( 'register_form', 'wproot_add_phone_field' );Здесь мы добавили поле с именем wproot_phone. Обратите внимание, что для удобства и безопасности используем префикс wproot_, чтобы избежать конфликтов с другими плагинами.
Валидация данных поля телефона
Добавленное поле необходимо валидировать, чтобы регистрация не прошла с пустым или некорректным значением. Для этого используем хук registration_errors:
function wproot_validate_phone_field( $errors, $sanitized_user_login, $user_email ) {
if ( empty( $_POST['wproot_phone'] ) ) {
$errors->add( 'wproot_phone_error', '<strong>Ошибка</strong>: Пожалуйста, укажите номер телефона.' );
} elseif ( ! preg_match( '/^\+?[0-9\s\-\(\)]+$/', $_POST['wproot_phone'] ) ) {
$errors->add( 'wproot_phone_error_format', '<strong>Ошибка</strong>: Неверный формат номера телефона.' );
}
return $errors;
}
add_filter( 'registration_errors', 'wproot_validate_phone_field', 10, 3 );Регулярное выражение позволяет принимать телефонные номера с цифрами, пробелами, дефисами, скобками и опциональным плюсом в начале. При некорректном вводе пользователь увидит понятное сообщение об ошибке.
Сохранение дополнительного поля в метаданных пользователя
После успешной регистрации нужно сохранить значение телефона в профиле пользователя. Для этого используем хук user_register:
function wproot_save_phone_field( $user_id ) {
if ( ! empty( $_POST['wproot_phone'] ) ) {
update_user_meta( $user_id, 'wproot_phone', sanitize_text_field( $_POST['wproot_phone'] ) );
}
}
add_action( 'user_register', 'wproot_save_phone_field' );<Теперь номер телефона будет сохранён в базе данных и доступен через функцию get_user_meta( $user_id, 'wproot_phone', true ).
Отображение пользовательского поля в профиле WordPress
Чтобы администратор или сам пользователь могли видеть и редактировать поле «Телефон» в админке, добавим это поле в профиль пользователя:
function wproot_show_phone_field_in_profile( $user ) {
?>
<h3>Дополнительная информация</h3>
<table class="form-table">
<tr>
<th><label for="wproot_phone">Телефон</label></th>
<td>
<input type="text" name="wproot_phone" id="wproot_phone" value="<?php echo esc_attr( get_user_meta( $user->ID, 'wproot_phone', true ) ); ?>" class="regular-text" />
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'wproot_show_phone_field_in_profile' );
add_action( 'edit_user_profile', 'wproot_show_phone_field_in_profile' );
function wproot_save_phone_field_in_profile( $user_id ) {
if ( ! current_user_can( 'edit_user', $user_id ) ) {
return false;
}
if ( isset( $_POST['wproot_phone'] ) ) {
update_user_meta( $user_id, 'wproot_phone', sanitize_text_field( $_POST['wproot_phone'] ) );
}
}
add_action( 'personal_options_update', 'wproot_save_phone_field_in_profile' );
add_action( 'edit_user_profile_update', 'wproot_save_phone_field_in_profile' );Так мы сделаем поле телефона видимым и редактируемым в админке.
Дополнительные рекомендации и популярные плагины для расширения регистрации
Если вам нужно добавить несколько полей или более сложные формы регистрации с валидацией и интеграцией, можно рассмотреть готовые решения:
- Clearfy Pro — плагин с множеством оптимизаций и улучшений, включая расширение форм регистрации.
- WPCommunity — расширенный плагин для управления сообществом с удобными настройками пользовательских полей.
Однако, если задача ограничивается одним-двумя полями, использование хуков — оптимальное и лёгкое решение.
Итог
Использование хуков register_form, registration_errors и user_register позволяет расширить стандартную форму регистрации WordPress без сторонних плагинов. Такой подход гибкий и позволяет полностью контролировать процесс сбора и хранения пользовательской информации. Рекомендуется всегда валидировать и фильтровать данные, чтобы избежать ошибок и уязвимостей.