Форма регистрации пользователей в WordPress по умолчанию содержит только базовые поля, такие как имя пользователя и email. Часто возникает задача расширить стандартную форму, добавив свои поля — например, телефон, адрес или согласие с правилами. В этой статье разберём, как изменить существующие поля и добавить новые, а также как сохранить и показать эти данные в профиле пользователя.
Почему важно кастомизировать форму регистрации WordPress
Стандартная форма регистрации подходит для базовых сайтов, но для многих проектов нужны дополнительные данные о пользователях. Например, интернет-магазинам важен телефон, форумам — дополнительные данные для профиля, а образовательным платформам — дата рождения или уровень знаний.
Добавляя свои поля, вы улучшаете взаимодействие с пользователями и собираете нужную информацию без дополнительной нагрузки на администраторов.
Однако важно делать это правильно, чтобы не сломать логику регистрации и обеспечить сохранность данных.
Как добавить дополнительные поля в форму регистрации WordPress
Для добавления новых полей нужно использовать хук register_form. Он позволяет вывести HTML-код новых полей в форме регистрации.
Например, добавим поле «Телефон» в форму регистрации:
function wpdemo_add_phone_field() {
$phone = ( isset( $_POST['wpdemo_phone'] ) ) ? sanitize_text_field( $_POST['wpdemo_phone'] ) : '';
echo '<p>'
. '<label for="wpdemo_phone">Телефон</label><br />'
. '<input type="text" name="wpdemo_phone" id="wpdemo_phone" class="input" value="' . esc_attr( $phone ) . '" size="25" />'
. '</p>';
}
add_action('register_form', 'wpdemo_add_phone_field');Этот код отображает поле в форме, при этом сохраняет введённое значение, если регистрация не прошла.
Валидация новых полей регистрации
После добавления поля нужно проверить введённые данные. Для этого используется хук registration_errors. В нашем случае проверим, что телефон введён и соответствует формату:
function wpdemo_validate_phone_field( $errors, $sanitized_user_login, $user_email ) {
if ( empty( $_POST['wpdemo_phone'] ) ) {
$errors->add( 'wpdemo_phone_error', '<strong>Ошибка</strong>: Пожалуйста, введите телефон.' );
} elseif ( ! preg_match( '/^\+?[0-9]{10,15}$/', $_POST['wpdemo_phone'] ) ) {
$errors->add( 'wpdemo_phone_error', '<strong>Ошибка</strong>: Телефон должен содержать от 10 до 15 цифр, возможно с плюсом в начале.' );
}
return $errors;
}
add_filter( 'registration_errors', 'wpdemo_validate_phone_field', 10, 3 );Таким образом, регистрация не пройдет, пока пользователь не введёт корректный номер телефона.
Сохранение дополнительных полей в профиле пользователя
После успешной регистрации нужно сохранить данные. Используем хук user_register:
function wpdemo_save_phone_field( $user_id ) {
if ( ! empty( $_POST['wpdemo_phone'] ) ) {
update_user_meta( $user_id, 'wpdemo_phone', sanitize_text_field( $_POST['wpdemo_phone'] ) );
}
}
add_action( 'user_register', 'wpdemo_save_phone_field' );Теперь значение телефона сохранится в метаполе пользователя.
Отображение и редактирование поля телефона в профиле пользователя
Чтобы администратор или сам пользователь могли видеть и редактировать телефон, добавим поле в профиль. Для это используем хуки show_user_profile и edit_user_profile:
function wpdemo_show_phone_field( $user ) {
?>
<h3>Дополнительная информация</h3>
<table class="form-table">
<tr>
<th><label for="wpdemo_phone">Телефон</label></th>
<td>
<input type="text" name="wpdemo_phone" id="wpdemo_phone" value="<?php echo esc_attr( get_user_meta( $user->ID, 'wpdemo_phone', true ) ); ?>" class="regular-text" />
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'wpdemo_show_phone_field' );
add_action( 'edit_user_profile', 'wpdemo_show_phone_field' );И добавим сохранение при обновлении профиля:
function wpdemo_save_phone_profile( $user_id ) {
if ( ! current_user_can( 'edit_user', $user_id ) ) {
return false;
}
if ( isset( $_POST['wpdemo_phone'] ) ) {
update_user_meta( $user_id, 'wpdemo_phone', sanitize_text_field( $_POST['wpdemo_phone'] ) );
}
}
add_action( 'personal_options_update', 'wpdemo_save_phone_profile' );
add_action( 'edit_user_profile_update', 'wpdemo_save_phone_profile' );Дополнительные советы по кастомизации формы регистрации
Добавление нескольких полей
Если нужно добавить не одно поле, а несколько, просто расширяйте функцию вывода и обработчиков соответственно. Можно добавить дату рождения, ссылки на соцсети, выбор пола и т.п.
Использование плагинов для добавления полей
Если хочется не писать код вручную, можно использовать плагины, например Clearfy Pro для расширенной кастомизации форм, либо WP Community, если нужна регистрация с дополнительными возможностями. Однако кодовый подход даёт максимальный контроль и гибкость.
Защита данных и безопасность
Обязательно фильтруйте и валидируйте все данные, чтобы избежать XSS и других уязвимостей. Используйте функции sanitize_text_field, esc_attr и другие валидационные методы.
Пример расширенной формы с несколькими полями
Добавим полей «Телефон» и «Компания» с проверкой и сохранением:
function wpdemo_add_custom_registration_fields() {
$phone = isset( $_POST['wpdemo_phone'] ) ? sanitize_text_field( $_POST['wpdemo_phone'] ) : '';
$company = isset( $_POST['wpdemo_company'] ) ? sanitize_text_field( $_POST['wpdemo_company'] ) : '';
echo '<p><label for="wpdemo_phone">Телефон</label><br />'
. '<input type="text" name="wpdemo_phone" id="wpdemo_phone" class="input" value="' . esc_attr( $phone ) . '" size="25" /></p>';
echo '<p><label for="wpdemo_company">Компания</label><br />'
. '<input type="text" name="wpdemo_company" id="wpdemo_company" class="input" value="' . esc_attr( $company ) . '" size="25" /></p>';
}
add_action('register_form', 'wpdemo_add_custom_registration_fields');
function wpdemo_validate_custom_registration_fields( $errors, $sanitized_user_login, $user_email ) {
if ( empty( $_POST['wpdemo_phone'] ) ) {
$errors->add( 'wpdemo_phone_error', '<strong>Ошибка</strong>: Пожалуйста, введите телефон.' );
} elseif ( ! preg_match( '/^\+?[0-9]{10,15}$/', $_POST['wpdemo_phone'] ) ) {
$errors->add( 'wpdemo_phone_error', '<strong>Ошибка</strong>: Телефон должен содержать от 10 до 15 цифр.' );
}
if ( empty( $_POST['wpdemo_company'] ) ) {
$errors->add( 'wpdemo_company_error', '<strong>Ошибка</strong>: Пожалуйста, укажите компанию.' );
}
return $errors;
}
add_filter( 'registration_errors', 'wpdemo_validate_custom_registration_fields', 10, 3 );
function wpdemo_save_custom_registration_fields( $user_id ) {
if ( ! empty( $_POST['wpdemo_phone'] ) ) {
update_user_meta( $user_id, 'wpdemo_phone', sanitize_text_field( $_POST['wpdemo_phone'] ) );
}
if ( ! empty( $_POST['wpdemo_company'] ) ) {
update_user_meta( $user_id, 'wpdemo_company', sanitize_text_field( $_POST['wpdemo_company'] ) );
}
}
add_action( 'user_register', 'wpdemo_save_custom_registration_fields' );Такой подход позволит вам максимально гибко собирать нужные данные при регистрации.
Заключение
Изменение и расширение формы регистрации WordPress — задача, часто встречающаяся в реальных проектах. С помощью хуков register_form, registration_errors и user_register вы можете добавить любые поля, валидировать и сохранять данные. Для удобства пользователей дополнительно реализуйте отображение и редактирование этих полей в профиле.
Для тех, кто не хочет писать код, советуем обратить внимание на плагины из WPShop.ru, такие как Clearfy Pro, которые помогают расширять стандартные возможности WordPress без сложного программирования.