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

В этом уроке пойдёт речь про добавление и валидацию полей не только в форме регистрации пользователей на сайте, но и непосредственно в форме регистрации в админке.

У меня также есть отдельный урок про добавление полей в форму регистрации WooCommerce!

Также хочу порекомендовать вам свой видеокурс по созданию темы WordPress на основе готовой HTML-вёрстки.

Форма регистрации на сайте (wp-login.php)

Например у меня на сайте вот она, эта форма. Весь процесс добавления полей можно разделить на три шага.

1. Добавление полей в форму

В этом нам поможем хук register_form. В качестве примера давайте добавим два поля – город и номер телефона.

/**
 * @snippet       Добавляем поля в форму регистрации
 * @author        Миша Рудрастых
 * @url           https://misha.agency/wordpress/add-register-fields.html
 */
add_action( 'register_form', 'true_show_fields' );
 
function true_show_fields() {
 
	$city = ! empty( $_POST[ 'city' ] ) ? $_POST[ 'city' ] : '';
	$phone = ! empty( $_POST[ 'phone' ] ) ? $_POST[ 'phone' ] : '';
	?>
	<p>
		<label for="city">Город</label>
		<input type="text" id="city" name="city" class="input" value="<?php echo esc_attr( $city ) ?>" size="25" />
	</p>
	<p>
		<label for="phone">Телефон</label>
		<input type="text" id="phone" name="phone" class="input" value="<?php echo esc_attr( $phone ) ?>" size="25" />
	</p>
	<?php
}

Не знаете, куда вставлять код?

  • Хук register_form запускается сразу после поля ввода Email, так что, если вы хотели добавить поля до него, то не хочу вас расстраивать, но у вас это сделать не получится.
  • На строчках 10 и 11 мы делаем обязательную проверку полей функцией empty() или isset() – это нужно, чтобы избежать PHP алертов.

После вставки этого кода форма регистрация у меня стала выглядеть вот так:

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

2. Валидация полей

Прежде, чем сохранять поля в базу данных после регистрации пользователя, давайте добавим валидацию на них. Ничего сложного – проверим лишь то, что они заполнены.

add_filter( 'registration_errors', 'true_check_fields', 25, 3 );
 
function true_check_fields( $errors, $sanitized_user_login, $user_email ) {
 
	/*
	 * Функция проверки полей, в этом примере только смотрит, чтобы они не оставались пустыми,
	 * но можно задать и свои условия,
	 * например запретить пользователям регистрироваться под одним и тем же номером телефона
	 */
	if( empty( $_POST[ 'city' ] ) ) {
		$errors->add( 'empty_city', '<strong>ОШИБКА:</strong> Укажите город плз.' );
	}
 
	if( empty( $_POST[ 'phone' ] ) ) {
		$errors->add( 'empty_phone', '<strong>ОШИБКА:</strong> Укажите телефон плз.' );
	}
 
	return $errors;
 
}

Хук registration_error запускается перед созданием пользователя, так что у нас есть прекрасная возможность проверить, что все поля заполнены как надо перед тем, как создавать пользователя с незаполненной информацией на сайте. Для добавления ошибки используем метод $errors->add(). В этом примере мы не используем переменные $sanitized_user_login и $user_email, но вы можете задействовать их тоже для дополнительных проверок, например, чтобы имя пользователя не содержало название вашего сайта.

Валидация полей в форме регистрации WordPress

3. Сохранение полей пользователя

Последний шаг – записываем наши значения полей в метаданные уже созданного пользователя.

add_action( 'user_register', 'true_register_fields' );
 
function true_register_fields( $user_id ) {
 
	update_user_meta( $user_id, 'city', sanitize_text_field( $_POST[ 'city' ] ) );
	update_user_meta( $user_id, 'phone', sanitize_text_field( $_POST[ 'phone' ] ) );
 
}

Тут я считаю уже не нужна проверка if( ! empty() ), так как мы проверяли это в предыдущем шаге.

В админке

Пришло время разобраться с бэкенд регистрация (то есть в админке) – это форма, которая находится в Пользователи > Добавить нового для администраторов и всех тех пользователей, у которых есть права на добавление новых пользователей.

Шаги будут примерно такими же, что и в добавлении полей в форму на сайте.

1. Добавление полей

Тут для добавления полей уже будет использоваться другой хук user_new_form и другая HTML-разметка. Поэтому просто прикрепить одну и ту же функцию на два разных хука не получится!

/**
 * @snippet       Добавление полей в форму регистрации в админке
 * @author        Миша Рудрастых
 * @url           https://misha.agency/wordpress/add-register-fields.html#wp-admin
 */
add_action( 'user_new_form', 'true_admin_registration_form' );
 
function true_admin_registration_form( $operation ) {
 
	if ( 'add-new-user' !== $operation ) {
		// $operation может так же принимать значение 'add-existing-user' для мультисайта
		return;
	}
 
	$city = ! empty( $_POST[ 'city' ] ) ? $_POST[ 'city' ] : '';
	$phone = ! empty( $_POST[ 'phone' ] ) ? $_POST[ 'phone' ] : '';
 
	?>
	<h3>Дополнительная информация</h3>
 
	<table class="form-table">
		<tr class="form-field">
			<th><label for="city">Город</label></th>
			<td><input id="city" name="city" class="input" type="text" value="<?php echo esc_attr( $city ) ?>" /></td>
		</tr>
		<tr class="form-field">
			<th><label for="phone">Телефон</label></th>
			<td><input id="phone" name="phone" class="input" type="text" value="<?php echo esc_attr( $phone ) ?>" /></td>
		</tr>
	</table>
	<?php
}

На случай, если не знаете, куда вставлять код.

Точно так же, как и хук register_form, хук user_new_form запускается уже после того, как все остальные поля будут отображены, и помещены прямо перед кнопкой «Добавить нового пользователя». Тут обратите внимание, что хук user_new_form используется в ядре WordPress дважды – во-первых, при регистрации нового пользователя, и во-вторых, при присвоении пользователя к блогу (для сайтов, работающих в сети мультисайт), поэтому мы проверяем переменную $operation на строчках 4–7.

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

2. Валидация полей при создании пользователя в админке

add_action( 'user_profile_update_errors', 'true_validate_fields_in_admin', 10, 3 );
 
function true_validate_fields_in_admin( $errors, $update, $user ) {
 
	if ( $update ) {
		return;
	}
 
	if( empty( $_POST[ 'city' ] ) ) {
		$errors->add( 'empty_city', '<strong>ОШИБКА:</strong> Укажите город плз.' );
	}
 
	if( empty( $_POST[ 'phone' ] ) ) {
		$errors->add( 'empty_phone', '<strong>ОШИБКА:</strong> Укажите телефон плз.' );
	}
}

И снова, как вы могли заметить, сама валидация (строки 9–15) точно такая же, как и валидация формы wp-login.php, поэтому давайте лучше поговорим об отличиях. Экшен-хук user_profile_update_errors даёт нам три параметра – $errors, $update и $user, в первую мы записываем ошибки, вторая – даёт понять, создаём мы пользователи или обновляем и последняя – объект WP_User. В нашей ситуации переменная $update содержит значение false, true она будет содержать – если мы будем обновлять уже существующего пользователя.

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

3. Сохранение полей

А вот тут для меня уже хорошие новости – хук edit_user_created_user идентичен хуку user_register, который мы использовали выше, поэтому, если вы будете добавлять поля и в форму на сайте и в админку, то можете использовать одну и ту же функцию и повесить её на оба хука.

add_action( 'edit_user_created_user', 'true_register_fields' );
// add_action( 'user_register', 'true_register_fields' );
 
function true_register_fields( $user_id ) {
 
	update_user_meta( $user_id, 'city', sanitize_text_field( $_POST[ 'city' ] ) );
	update_user_meta( $user_id, 'phone', sanitize_text_field( $_POST[ 'phone' ] ) );
 
}

А про отображение полей в профиле пользователя уже читайте отдельный урок.

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Если вам нужна помощь с сайтом или разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда будем рады вам помочь!

Комментарии — 44

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.