Иногда стандартных полей в форме регистрации WordPress недостаточно для сбора необходимой информации о пользователях. В этой статье мы разберём, как добавить уникальное пользовательское поле, например, «Идентификатор партнёра» или «Код приглашения», который должен быть уникальным для каждого пользователя и проверяться при регистрации.
Почему важно уникальное поле в форме регистрации WordPress
Добавление уникального поля позволяет контролировать регистрацию, расширять данные профиля пользователя и интегрировать сайт с внешними сервисами. Например, поле «Промокод» поможет отслеживать источники регистрации или бонусы, а «Номер телефона» с проверкой поможет избежать дублирования.
Без проверки уникальности поле может дублироваться, что нарушит логику работы сайта и усложнит аналитику.
Добавление пользовательского поля в форму регистрации WordPress
Для начала добавим поле в форму регистрации. Используем хук register_form:
function wpbuy_add_custom_registration_field() { $value = ( isset( $_POST['wpbuy_custom_field'] ) ) ? sanitize_text_field( $_POST['wpbuy_custom_field'] ) : ''; echo '<p><label for="wpbuy_custom_field">Идентификатор партнёра (уникальный)<br /><input type="text" name="wpbuy_custom_field" id="wpbuy_custom_field" class="input" value="' . esc_attr( $value ) . '" size="25" /></label></p>';}add_action( 'register_form', 'wpbuy_add_custom_registration_field' );Этот код добавит текстовое поле в форму регистрации.
Валидация уникальности поля при регистрации
Чтобы проверить, что введённое значение уникально, используем хук registration_errors. Проверим, что поле заполнено и не повторяется в базе:
function wpbuy_validate_custom_registration_field( $errors, $sanitized_user_login, $user_email ) { if ( empty( $_POST['wpbuy_custom_field'] ) ) { $errors->add( 'wpbuy_custom_field_error', '<strong>ОШИБКА</strong>: Пожалуйста, введите идентификатор партнёра.' ); } else { global $wpdb; $custom_value = sanitize_text_field( $_POST['wpbuy_custom_field'] ); $user_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'wpbuy_custom_field' AND meta_value = %s", $custom_value ) ); if ( $user_id ) { $errors->add( 'wpbuy_custom_field_error', '<strong>ОШИБКА</strong>: Такой идентификатор уже существует. Пожалуйста, используйте другой.' ); } } return $errors;}add_filter( 'registration_errors', 'wpbuy_validate_custom_registration_field', 10, 3 );Сохранение уникального поля при регистрации
После успешной валидации нужно сохранить поле в метаданных пользователя:
function wpbuy_save_custom_registration_field( $user_id ) { if ( ! empty( $_POST['wpbuy_custom_field'] ) ) { update_user_meta( $user_id, 'wpbuy_custom_field', sanitize_text_field( $_POST['wpbuy_custom_field'] ) ); }}add_action( 'user_register', 'wpbuy_save_custom_registration_field' );Теперь уникальное поле сохраняется и доступно в профиле пользователя.
Вывод и редактирование уникального поля в админке WordPress
Для удобства администраторов добавим отображение и редактирование этого поля в профиле пользователя в админке.
Отображение и редактирование в профиле
function wpbuy_show_custom_field_in_profile( $user ) { $value = get_user_meta( $user->ID, 'wpbuy_custom_field', true ); ?> <h3>Дополнительные данные</h3> <table class="form-table"> <tr> <th><label for="wpbuy_custom_field">Идентификатор партнёра (уникальный)</label></th> <td> <input type="text" name="wpbuy_custom_field" id="wpbuy_custom_field" value="<?php echo esc_attr( $value ); ?>" class="regular-text" /> <br /> <span class="description">Уникальный идентификатор, используемый для учёта партнёрских ссылок.</span> </td> </tr> </table> <?php }add_action( 'show_user_profile', 'wpbuy_show_custom_field_in_profile' );add_action( 'edit_user_profile', 'wpbuy_show_custom_field_in_profile' );Сохранение изменений в профиле
function wpbuy_save_custom_field_profile( $user_id ) { if ( ! current_user_can( 'edit_user', $user_id ) ) { return false; } if ( isset( $_POST['wpbuy_custom_field'] ) ) { $new_value = sanitize_text_field( $_POST['wpbuy_custom_field'] ); global $wpdb; $exists_user_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'wpbuy_custom_field' AND meta_value = %s AND user_id != %d", $new_value, $user_id ) ); if ( ! $exists_user_id ) { update_user_meta( $user_id, 'wpbuy_custom_field', $new_value ); } else { add_action( 'user_profile_update_errors', function( $errors ) { $errors->add( 'wpbuy_custom_field_error', '<strong>ОШИБКА</strong>: Такой идентификатор уже используется другим пользователем.' ); } ); } }}add_action( 'personal_options_update', 'wpbuy_save_custom_field_profile' );add_action( 'edit_user_profile_update', 'wpbuy_save_custom_field_profile' );Так мы обеспечим уникальность и при редактировании через админку.
Использование плагинов для расширения функционала регистрации
Если вы предпочитаете не писать код, можно использовать плагины с поддержкой пользовательских полей и проверки уникальности, например:
- Clearfy Pro — оптимизация и расширение функционала, включая кастомные поля
- WPGPT — помогает генерировать формы регистрации с кастомными полями на базе ИИ
- Плагины для пользовательских полей, например Advanced Custom Fields (ACF) или Profile Builder с настройкой уникальности
Однако ручное добавление кода даёт больше контроля и производительности.
Советы по безопасности и оптимизации
При работе с пользовательскими полями регистрации всегда применяйте санитизацию и валидацию данных. Используйте nonce для защиты форм, если расширяете функционал, и проверяйте права пользователя при сохранении данных в админке.
Для больших сайтов с высокой нагрузкой можно кэшировать результаты запросов к базе, например, используя Transients API, чтобы снизить нагрузку при проверке уникальности.
Итог
Добавление уникального пользовательского поля в регистрацию WordPress — задача, вполне решаемая при помощи нескольких хуков: register_form, registration_errors и user_register. Мы рассмотрели полный цикл: добавление поля, валидация, сохранение и отображение в профиле администратора. Это расширит функционал вашего сайта и улучшит сбор данных о пользователях.