Хук registration_errors
позволяет добавлять пользовательские проверки данных при регистрации нового пользователя в WordPress. Это важно для проверки введенной информации, особенно если используются дополнительные поля, или для создания дополнительных условий регистрации, например, для защиты от спама.
apply_filters( 'registration_errors', WP_Error $errors, string $sanitized_user_login, string $user_email );
Хук registration_errors
вызывается после того, как данные из формы регистрации были отправлены, но перед их сохранением в базу данных. Хук позволяет проверить введенные данные и прервать регистрацию, если обнаружены ошибки. Например, хук может проверить уникальность имени пользователя и электронной почты или добавить пользовательские проверки на основе дополнительных полей.
Параметры
$errors
(объектWP_Error
): объект, содержащий ошибки регистрации. Если объект содержит ошибки, регистрация будет прервана.$sanitized_user_login
(строка): отфильтрованное имя пользователя.$user_email
(строка): электронная почта пользователя.
Пример 1: Проверка обязательного дополнительного поля
В этом примере проверяется обязательное текстовое поле «Favorite Color», добавленное с помощью хука register_form
. Если пользователь не заполнил это поле, регистрация прерывается и выводится сообщение об ошибке.
<?php
add_action( 'register_form', 'add_favorite_color_field' );
add_filter( 'registration_errors', 'validate_favorite_color_field', 10, 3 );
function add_favorite_color_field() {
?>
<p>
<label for="favorite_color"><?php _e( 'Favorite Color', 'textdomain' ); ?><br />
<input type="text" name="favorite_color" id="favorite_color" class="input" value="<?php echo esc_attr( isset( $_POST['favorite_color'] ) ? $_POST['favorite_color'] : '' ); ?>" size="25" /></label>
</p>
<?php
}
function validate_favorite_color_field( $errors, $sanitized_user_login, $user_email ) {
if ( empty( $_POST['favorite_color'] ) ) {
$errors->add( 'favorite_color_error', __( '<strong>ERROR</strong>: Please enter your favorite color.', 'textdomain' ) );
}
return $errors;
}
Пример 2: Проверка формата пользовательского поля «Почтовый индекс»
Этот пример добавляет проверку для поля «Почтовый индекс», требуя, чтобы он содержал только пять цифр. Если значение не соответствует, выводится сообщение об ошибке.
<?php
add_action( 'register_form', 'add_zipcode_field' );
add_filter( 'registration_errors', 'validate_zipcode_field', 10, 3 );
function add_zipcode_field() {
?>
<p>
<label for="zipcode"><?php _e( 'Zip Code', 'textdomain' ); ?><br />
<input type="text" name="zipcode" id="zipcode" class="input" value="<?php echo esc_attr( isset( $_POST['zipcode'] ) ? $_POST['zipcode'] : '' ); ?>" size="5" /></label>
</p>
<?php
}
function validate_zipcode_field( $errors, $sanitized_user_login, $user_email ) {
if ( ! preg_match( '/^\d{5}$/', $_POST['zipcode'] ) ) {
$errors->add( 'zipcode_error', __( '<strong>ERROR</strong>: Please enter a valid 5-digit Zip Code.', 'textdomain' ) );
}
return $errors;
}
Пример 3: Проверка соглашения с политикой конфиденциальности
В этом примере добавляется чекбокс «Я согласен с политикой конфиденциальности». Если чекбокс не отмечен, регистрация не проходит.
<?php
add_action( 'register_form', 'add_privacy_policy_checkbox' );
add_filter( 'registration_errors', 'validate_privacy_policy_checkbox', 10, 3 );
function add_privacy_policy_checkbox() {
?>
<p>
<label>
<input type="checkbox" name="privacy_policy" value="1" <?php checked( isset( $_POST['privacy_policy'] ), 1 ); ?> />
<?php _e( 'I agree to the Privacy Policy', 'textdomain' ); ?>
</label>
</p>
<?php
}
function validate_privacy_policy_checkbox( $errors, $sanitized_user_login, $user_email ) {
if ( empty( $_POST['privacy_policy'] ) ) {
$errors->add( 'privacy_policy_error', __( '<strong>ERROR</strong>: You must agree to the Privacy Policy.', 'textdomain' ) );
}
return $errors;
}
Пример 4: Проверка уникальности дополнительного поля (например, «Имя компании»)
Этот пример показывает, как проверить уникальность значения в поле «Имя компании». Если имя компании уже зарегистрировано, регистрация не проходит.
<?php
add_action( 'register_form', 'add_company_name_field' );
add_filter( 'registration_errors', 'validate_unique_company_name', 10, 3 );
function add_company_name_field() {
?>
<p>
<label for="company_name"><?php _e( 'Company Name', 'textdomain' ); ?><br />
<input type="text" name="company_name" id="company_name" class="input" value="<?php echo esc_attr( isset( $_POST['company_name'] ) ? $_POST['company_name'] : '' ); ?>" size="25" /></label>
</p>
<?php
}
function validate_unique_company_name( $errors, $sanitized_user_login, $user_email ) {
global $wpdb;
$company_name = sanitize_text_field( $_POST['company_name'] );
// Проверка, существует ли уже такое имя компании
$existing = $wpdb->get_var( $wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->usermeta} WHERE meta_key = 'company_name' AND meta_value = %s",
$company_name
) );
if ( $existing ) {
$errors->add( 'company_name_error', __( '<strong>ERROR</strong>: This company name is already registered.', 'textdomain' ) );
}
return $errors;
}
Заключение
Хук registration_errors
— мощный инструмент для настройки и проверки данных при регистрации пользователей в WordPress. Он помогает гибко адаптировать форму регистрации, добавляя правила валидации и проверки, которые соответствуют уникальным требованиям вашего сайта.