Вопрос или проблема
Я использую Ultimate Member и классическую форму для регистрации.
Я включил “Сильный пароль”, но я хочу, чтобы мои пользователи хотя бы заполнили свой пароль одним специальным символом (например, “# % $ …”).
Я не нашел ни одного плагина, поэтому попытался найти подходящий хуку и попробовал этот код:
function um_submit_form_register_theme($args) {
global $ultimatemember;
$password = $_POST['user_password-257'];
if ( !isset($ultimatemember->form->errors) ) {
if (!preg_match("/\W/", $password)) {
$ultimatemember->classes['form']->add_error( 'user_password-257', __('Ваш пароль должен содержать специальный символ') );
} else {
do_action('um_user_registration', $args);
}
}
do_action('um_user_registration_extra_hook', $args );
}
add_action('um_submit_form_register', 'um_submit_form_register_theme', 10);
Но это не работает… Регистрация проходит без специального символа. Есть идеи?
Вам нужно сделать несколько вещей. Но вы можете изменить хук, который использует Ultimate Member. Они используют класс валидации. Но, учитывая ваши требования, вы можете обойти использование этого класса. Вот решение, которое, как я думаю, сработает.
remove_action( 'um_submit_form_register', 'um_submit_form_register', 10 );
Теперь мы зарегистрируем новый метод.
add_action( 'um_submit_form_register', 'my_custom_submit_form_register', 10 );
Вот функция. Я думаю, что разработчикам нужно будет предоставить фильтрацию внутри класса валидации в следующем релизе.
function my_custom_submit_form_register( $args ) {
if ( isset( UM()->form()->errors ) ) {
return false;
}
/**
* UM hook
*
* @type filter
* @title um_add_user_frontend_submitted
* @description Расширить данные пользователя при отправке формы регистрации
* @input_vars
* [{"var":"$submitted","type":"array","desc":"Данные регистрации"}]
* @change_log
* ["С 2.0"]
* @usage
* <?php add_filter( 'um_add_user_frontend_submitted', 'function_name', 10, 1 ); ?>
* @example
* <?php
* add_filter( 'um_add_user_frontend_submitted', 'my_add_user_frontend_submitted', 10, 1 );
* function my_add_user_frontend_submitted( $submitted ) {
* // ваш код здесь
* return $submitted;
* }
* ?>
*/
$args = apply_filters( 'um_add_user_frontend_submitted', $args );
extract( $args );
if ( ! empty( $username ) && empty( $user_login ) ) {
$user_login = $username;
}
if ( ! empty( $first_name ) && ! empty( $last_name ) && empty( $user_login ) ) {
if ( UM()->options()->get( 'permalink_base' ) == 'name' ) {
$user_login = rawurlencode( strtolower( str_replace( " ", ".", $first_name . " " . $last_name ) ) );
} elseif ( UM()->options()->get( 'permalink_base' ) == 'name_dash' ) {
$user_login = rawurlencode( strtolower( str_replace( " ", "-", $first_name . " " . $last_name ) ) );
} elseif ( UM()->options()->get( 'permalink_base' ) == 'name_plus' ) {
$user_login = strtolower( str_replace( " ", "+", $first_name . " " . $last_name ) );
} else {
$user_login = strtolower( str_replace( " ", "", $first_name . " " . $last_name ) );
}
// если полное имя существует
$count = 1;
$temp_user_login = $user_login;
while ( username_exists( $temp_user_login ) ) {
$temp_user_login = $user_login . $count;
$count++;
}
if ( $temp_user_login !== $user_login ) {
$user_login = $temp_user_login;
}
}
if ( empty( $user_login ) && ! empty( $user_email ) ) {
$user_login = $user_email;
}
$unique_userID = UM()->query()->count_users() + 1;
if ( empty( $user_login ) || strlen( $user_login ) > 30 && ! is_email( $user_login ) ) {
$user_login = 'user' . $unique_userID;
}
if ( isset( $username ) && is_email( $username ) ) {
$user_email = $username;
}
if ( ! isset( $user_password ) ) {
$user_password = apply_filters('my_custom_password_strength', UM()->validation()->generate( 8 ));
}
if ( empty( $user_email ) ) {
$site_url = @$_SERVER['SERVER_NAME'];
$user_email="nobody" . $unique_userID . '@' . $site_url;
/**
* UM hook
*
* @type filter
* @title um_user_register_submitted__email
* @description Изменить электронную почту по умолчанию, если она пустая при регистрации
* @input_vars
* [{"var":"$user_email","type":"string","desc":"Электронная почта по умолчанию"}]
* @change_log
* ["С 2.0"]
* @usage
* <?php add_filter( 'um_user_register_submitted__email', 'function_name', 10, 1 ); ?>
* @example
* <?php
* add_filter( 'um_user_register_submitted__email', 'my_user_register_submitted__email', 10, 1 );
* function my_user_register_submitted__email( $user_email ) {
* // ваш код здесь
* return $user_email;
* }
* ?>
*/
$user_email = apply_filters( 'um_user_register_submitted__email', $user_email );
}
$credentials = array(
'user_login' => $user_login,
'user_password' => $user_password,
'user_email' => trim( $user_email ),
);
$args['submitted'] = array_merge( $args['submitted'], $credentials );
$args = array_merge( $args, $credentials );
// получить роль пользователя из глобального контекста или настроек формы
$user_role = UM()->form()->assigned_role( UM()->form()->form_id );
// получить роль пользователя из выпадающего списка Роли или радио
if ( isset( $args['role'] ) ) {
global $wp_roles;
$um_roles = get_option( 'um_roles' );
if ( ! empty( $um_roles ) ) {
$role_keys = array_map( function( $item ) {
return 'um_' . $item;
}, get_option( 'um_roles' ) );
} else {
$role_keys = array();
}
$exclude_roles = array_diff( array_keys( $wp_roles->roles ), array_merge( $role_keys, array( 'subscriber' ) ) );
// если роль правильно установлена, установить ее
if ( ! in_array( $args['role'], $exclude_roles ) ) {
$user_role = $args['role'];
}
}
/**
* UM hook
*
* @type filter
* @title um_registration_user_role
* @description Изменить роль пользователя в процессе регистрации
* @input_vars
* [{"var":"$role","type":"string","desc":"Роль пользователя"},
* {"var":"$submitted","type":"array","desc":"Данные регистрации"}]
* @change_log
* ["С 2.0"]
* @usage
* <?php add_filter( 'um_registration_user_role', 'function_name', 10, 2 ); ?>
* @example
* <?php
* add_filter( 'um_registration_user_role', 'my_registration_user_role', 10, 2 );
* function my_user_register_submitted__email( $role, $submitted ) {
* // ваш код здесь
* return $role;
* }
* ?>
*/
$user_role = apply_filters( 'um_registration_user_role', $user_role, $args );
$userdata = array(
'user_login' => $user_login,
'user_pass' => $user_password,
'user_email' => $user_email,
'role' => $user_role,
);
$user_id = wp_insert_user( $userdata );
/**
* UM hook
*
* @type action
* @title um_user_register
* @description После завершения регистрации пользователя UM.
* @input_vars
* [{"var":"$user_id","type":"int","desc":"ID пользователя"},
* {"var":"$args","type":"array","desc":"Данные формы"}]
* @change_log
* ["С 2.0"]
* @usage add_action( 'um_user_register', 'function_name', 10, 2 );
* @example
* <?php
* add_action( 'um_user_register', 'my_user_register', 10, 2 );
* function my_user_register( $user_id, $args ) {
* // ваш код здесь
* }
* ?>
*/
do_action( 'um_user_register', $user_id, $args );
return $user_id;
}
Я ничего не изменил, только добавил фильтр, так что не будет проблем, если разработчики что-то изменят (вы столкнетесь с проблемами, если разработчики добавят что-то новое, иначе я бы обратился к ним, чтобы добавить фильтр). Вот отфильтрованная функция.
function my_custom_password_strength() {
global $ultimatemember;
$password = $_POST['user_password-257'];
if (preg_match(" /^(?=.*[!@#$%^&*-])(?=.*[0-9])(?=.*[A-Z]).{8,20}$/", $password)) {
return wp_generate_password(8)
} else {
$ultimatemember->classes['form']->add_error( 'user_password-257', __('Ваш пароль должен содержать специальный символ') );
do_action('um_user_registration', $args);
}
}
Это единственный способ, которым вы можете это сделать. Возможно, вам нужно будет добавить несколько дополнительных проверок. Но помните, что нужно работать только с функцией фильтра my_custom_password_strength()
.
Надеюсь, это поможет. Спасибо
Ответ или решение
Чтобы добавить новое правило пароля в форму регистрации Ultimate Member и обеспечить наличие хотя бы одного специального символа в пароле, вам нужно внести изменения в код, который управляет процессом регистрации. В этом ответе подробно рассмотрим необходимые шаги и корректировки, чтобы успешно реализовать данное требование.
Шаг 1: Удаление оригинального хука
Ultimate Member использует определенные хуки для обработки регистрации пользователей. Ваша задача — заменить стандартный метод на свой собственный:
remove_action('um_submit_form_register', 'um_submit_form_register', 10);
Этот код необходимо добавить в файл функций вашей темы или в плагин. Он отключает стандартную обработку регистрации, чтобы вы могли использовать свою функцию.
Шаг 2: Создание новой функции для обработки регистрации
Теперь создайте вашу собственную функцию, которая будет обрабатывать данные формы регистрации:
add_action('um_submit_form_register', 'my_custom_submit_form_register', 10);
function my_custom_submit_form_register($args) {
global $ultimatemember;
// Проверка на наличие ошибок
if (isset(UM()->form()->errors)) {
return false;
}
// Получаем введенный пароль
$user_password = $args['user_password'];
// Проверка наличия специального символа
if (!preg_match("/[!@#$%^&*()-_=+{};':\"|,.<>?]/", $user_password)) {
$ultimatemember->classes['form']->add_error('user_password', __('Ваш пароль должен содержать хотя бы один специальный символ.'));
return false; // Прерываем выполнение при ошибке
}
// Остальная часть кода для обработки регистрации...
// Вставляем пользователя в базу данных
$userdata = array(
'user_login' => $args['user_login'],
'user_pass' => $user_password,
'user_email' => $args['user_email'],
'role' => UM()->form()->assigned_role(UM()->form()->form_id),
);
$user_id = wp_insert_user($userdata);
do_action('um_user_register', $user_id, $args);
return $user_id;
}
Шаг 3: Проверка пароля на наличие специальных символов
Ваша новая функция теперь включает проверку пароля на наличие хотя бы одного специального символа, используя регулярное выражение. Если пароль не соответствует требованиям, будет добавлена ошибка, и регистрация не будет завершена.
Шаг 4: Фильтрация пользовательского пароля (опционально)
Если вы хотите создать более сложные правила проверки пароля (например, требование к длине, наличию цифр и заглавных букв), вы можете создать вспомогательную функцию и подключить ее как фильтр.
function my_custom_password_strength($password) {
if (preg_match("/^(?=.*[!@#$%^&*()\-_=+{};':\"|,.<>?])(?=.*[0-9])(?=.*[A-Z]).{8,20}$/", $password)) {
return $password; // Пароль соответствует требованиям
} else {
global $ultimatemember;
$ultimatemember->classes['form']->add_error('user_password', __('Пароль должен содержать хотя бы один специальный символ и соответствовать всем требованиям.'));
return false; // Пароль не соответствует требованиям
}
}
Затем добавьте фильтр для этой функции:
add_filter('my_custom_password_strength', 'my_custom_password_strength');
Заключение
Теперь ваша форма регистрации Ultimate Member будет требовать от пользователей наличия хотя бы одного специального символа в пароле при регистрации. Такое решение повышает безопасность, поскольку защищает от простых и небезопасных паролей. Для обеспечения дальнейшей безопасности рассмотреть возможность использования дополнительных правил проверки пароля, таких как длина или сочетание разных типов символов.
Важно помнить, что тестирование и всесторонняя проверка нового кода жизненно важны для предотвращения возможных ошибок в процессе регистрации. Надеюсь, данная информация поможет вам успешно внедрить требуемое правило!