Вопрос или проблема
Я хочу показать выпадающий список для ролей пользователя в форме регистрации. Я использую эту модель:
/* РОЛИ В СПИСКЕ РЕГИСТРАЦИИ */
// 1. Добавить новый элемент формы...
add_action( 'register_form', 'odin_register_form' );
function odin_register_form() {
global $wp_roles;
echo '<select name="role" class="input">';
echo '<option disabled selected value> -- </option>';
foreach ( $wp_roles->roles as $key=>$value ):
echo '<option value="'.$key.'">'.$value['name'].'</option>';
endforeach;
echo '</select>';
}
// 2. Добавить валидацию.
add_filter( 'registration_errors', 'odin_registration_errors', 10, 3 );
function odin_registration_errors( $errors, $sanitized_user_login, $user_email ) {
if (
empty( $_POST['role'] ) || ! empty( $_POST['role'] ) && trim( $_POST['role'] ) == ''
|| $_POST['role'] == 'administrator'
|| $_POST['role'] == 'editor'
|| $_POST['role'] == 'contributor'
|| $_POST['role'] == 'author'
|| $_POST['role'] == 'shop_manager'
) {
$errors->add( 'role_error', __( '<strong>ОШИБКА</strong>: Выберите корректный вариант.', 'odin' ) );
}
return $errors;
}
//3. Наконец, сохранить нашу дополнительную метаинформацию пользователя при регистрации.
add_action( 'user_register', 'odin_user_register' );
function odin_user_register( $user_id ) {
if (
$_POST['role'] != 'administrator' ||
$_POST['role'] != 'editor' ||
$_POST['role'] != 'contributor' ||
$_POST['role'] != 'shop_manager' ||
$_POST['role'] != 'author'
) {
$user_id = wp_update_user( array( 'ID' => $user_id, 'role' => $_POST['role'] ) );
}
}
Смысл в том, что я не видел, чтобы ошибка возникала, когда валидация выбирает пустой вариант.
Так что я могу сделать следующее:
1) Отфильтровать типы пользователей, кроме администратора, редактора, автора, контрибьютора и менеджера магазина. Я мог бы установить только функции подписчика и клиента, но проект должен иметь возможность создавать другие роли, не переписывая код заново.
2) Мне нужно валидировать запись в этом поле, потому что у нас уже есть фильтр для рендеринга ролей в списке выбора, мы должны убедиться, что нет возможности, чтобы злоумышленник вставил вариант в HTML с значением ‘administrator’, например. Это не должно происходить с любой из ролей с некоторыми редакционными возможностями.
Мне нужен ваш совет о том, как я могу это сделать.
Вы можете использовать wp_dropdown_roles()
Я думаю, что !isset
является более надежным способом тестирования, поэтому я добавил это:
add_filter( 'registration_errors', 'odin_registration_errors', 10, 3 );
function odin_registration_errors( $errors, $sanitized_user_login, $user_email ) {
if (
!isset( $_POST['role'] )
|| empty( $_POST['role'] )
|| trim( $_POST['role'] ) == ''
|| $_POST['role'] == 'administrator'
|| $_POST['role'] == 'editor'
|| $_POST['role'] == 'contributor'
|| $_POST['role'] == 'author'
|| $_POST['role'] == 'shop_manager'
) {
$errors->add( 'role_error', __( '<strong>ОШИБКА</strong>: Выберите корректный вариант роли.', 'odin' ) );
}
// отладка $error в файл
$debugfile = get_stylesheet_directory().'/roledebug.txt';
ob_start(); print_r($errors); $debugdata = ob_get_contents();
file_put_contents($debugfile,$debugdata); ob_end_clean();
return $errors;
}
И я не уверен, но возможно, нужно изменить атрибут <select>
элемента selected
на selected="selected"
в первой функции тоже.
Ответ или решение
Валидация роли пользователя при регистрации: Полное руководство
В процессе создания системы регистрации пользователей в WordPress необходимо не только предоставить пользователям возможность выбора роли, но и тщательно валидировать эти выборы, чтобы избежать потенциальных уязвимостей и обеспечить корректность данных. В этом руководстве мы рассмотрим, как правильно настроить выбор ролей пользователей, осуществить проверку этих ролей, а также сохранить их в базе данных.
1. Создание выпадающего списка ролей
Для начала добавим элемент формы для выбора роли пользователя. Используя функцию add_action
, мы внедряем новый элемент в форму регистрации и генерируем выпадающий список:
add_action( 'register_form', 'odin_register_form' );
function odin_register_form() {
global $wp_roles;
echo '<select name="role" class="input">';
echo '<option disabled selected value> -- </option>';
foreach ( $wp_roles->roles as $key => $value ) {
// Только выводим роли, которые не являются административными
if (!in_array($key, ['administrator', 'editor', 'author', 'contributor', 'shop_manager'])) {
echo '<option value="'.$key.'">'.$value['name'].'</option>';
}
}
echo '</select>';
}
Эта функция создает выпадающий список, в который будут включены только роли пользователей, не имеющие административных привилегий.
2. Валидация выбранной роли
После добавления элемента формы, необходимо добавить валидацию, чтобы убедиться, что пользователь выбрал корректную роль. Инструкция ниже поможет вам настроить проверку:
add_filter( 'registration_errors', 'odin_registration_errors', 10, 3 );
function odin_registration_errors( $errors, $sanitized_user_login, $user_email ) {
// Проверка наличия и корректности выбранной роли
if (
!isset( $_POST['role'] ) ||
empty( $_POST['role']) ||
trim( $_POST['role']) === '' ||
in_array($_POST['role'], ['administrator', 'editor', 'contributor', 'author', 'shop_manager'])
) {
$errors->add( 'role_error', __( '<strong>ERROR</strong>: Выберите корректную роль.', 'odin' ) );
}
// Для отладки можно записывать ошибки в файл
$debugfile = get_stylesheet_directory().'/roledebug.txt';
ob_start();
print_r($errors);
$debugdata = ob_get_contents();
file_put_contents($debugfile, $debugdata);
ob_end_clean();
return $errors;
}
Данная функция производит проверку на наличие роли и ее корректность, добавляя ошибку в случае, если роль не была выбрана или если выбрана административная роль. Запись отладочной информации в файл поможет вам отслеживать любые ошибки, которые могут возникать в процессе регистрации.
3. Сохранение выбранной роли при регистрации
После успешной проверки и валидации, необходимо сохранить выбранную роль в базе данных:
add_action( 'user_register', 'odin_user_register' );
function odin_user_register( $user_id ) {
// Сохраняем роль, только если она не является административной
if (
isset($_POST['role']) &&
!in_array($_POST['role'], ['administrator', 'editor', 'contributors' , 'shop_manager', 'author'])
) {
wp_update_user( array( 'ID' => $user_id, 'role' => $_POST['role'] ) );
}
}
Эта функция обновляет роль пользователя на ту, которая была выбрана в форме регистрации, и игнорирует любые попытки назначить административные роли.
Заключение
Следуя данным шагам, вы сможете создать функциональную систему регистрации пользовательских ролей в WordPress, безопасную и соответствующую требованиям вашего проекта. Важно понимать, что валидация и правильное ограничение ролей — это ключ к безопасности и управляемости вашей системы.
Настройка и обеспечение защиты данных пользователей — это не просто задача программиста, а важный аспект в разработке стабильного и безопасного приложения. Если у вас есть дополнительные вопросы или вам нужна помощь, не стесняйтесь обращаться!