В этом уроке пойдёт речь про добавление и валидацию полей не только в форме регистрации пользователей на сайте, но и непосредственно в форме регистрации в админке.
У меня также есть отдельный урок про добавление полей в форму регистрации WooCommerce!
Форма регистрации на сайте (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 }
Не знаете, куда вставлять код?
После вставки этого кода форма регистрация у меня стала выглядеть вот так:
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
, но вы можете задействовать их тоже для дополнительных проверок, например, чтобы имя пользователя не содержало название вашего сайта.
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.
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
она будет содержать – если мы будем обновлять уже существующего пользователя.
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' ] ) ); }
А про отображение полей в профиле пользователя уже читайте отдельный урок.