В WordPress часто возникает задача не просто зарегистрировать нового пользователя, а сразу назначить ему определённую роль, чтобы ограничить или расширить возможности на сайте. В этой статье разберём, как реализовать регистрацию пользователей с автоматическим присвоением нужной роли. Это особенно важно для сайтов с разными типами пользователей: подписчики, авторы, редакторы, клиенты и т.д.
Почему важно назначать роль при регистрации
По умолчанию WordPress назначает новым пользователям роль «Подписчик». Но в некоторых случаях нужно, чтобы пользователь сразу становился автором, клиентом или другой кастомной ролью. Это позволяет управлять доступом к контенту и функционалу сайта без дополнительных манипуляций.
Например, на сайте с платным контентом можно создавать роли «Премиум-пользователь» или «Партнёр», которым открываются дополнительные разделы.
Как добавить поле выбора роли в форму регистрации
Мы рассмотрим добавление на страницу регистрации поля с выбором роли. Для этого воспользуемся хуками WordPress и добавим кастомный селект.
Добавление поля выбора роли
Чтобы вывести поле выбора ролей, используем хук register_form:
function wpin_add_role_select_to_registration() {
$roles = ['subscriber' => 'Подписчик', 'author' => 'Автор', 'customer' => 'Клиент']; // Пример ролей
echo '<p><label for="role">Выберите роль</label><br>';
echo '<select name="role" id="role" required>';
foreach ($roles as $role_value => $role_name) {
echo "<option value=\"$role_value\">$role_name</option>";
}
echo '</select></p>';
}
add_action('register_form', 'wpin_add_role_select_to_registration');Здесь мы объявляем массив ролей и создаём выпадающий список для выбора при регистрации.
Валидация и сохранение выбранной роли
После добавления поля нужно проверить, что пользователь выбрал роль, и при сохранении зарегистрировать его с нужной ролью.
Валидация поля роли
Для проверки используем фильтр registration_errors:
function wpin_validate_role_select($errors, $sanitized_user_login, $user_email) {
if (empty($_POST['role']) || !in_array($_POST['role'], ['subscriber', 'author', 'customer'])) {
$errors->add('role_error', '<strong>Ошибка:</strong> выберите корректную роль.');
}
return $errors;
}
add_filter('registration_errors', 'wpin_validate_role_select', 10, 3);Назначение роли при регистрации
Для назначения роли используем хук user_register:
function wpin_set_user_role_on_registration($user_id) {
if (!empty($_POST['role']) && in_array($_POST['role'], ['subscriber', 'author', 'customer'])) {
$user = new WP_User($user_id);
$user->set_role(sanitize_text_field($_POST['role']));
}
}
add_action('user_register', 'wpin_set_user_role_on_registration');Таким образом, сразу после регистрации пользователь получит роль, которую выбрал.
Создание кастомной роли «Клиент»
Если у вас нет роли «customer», её можно добавить программно. Это удобно для сайтов с продажами или личным кабинетом:
function wpin_add_customer_role() {
add_role('customer', 'Клиент', [
'read' => true, // Разрешение читать сайт
'edit_posts' => false,
'delete_posts' => false,
]);
}
register_activation_hook(__FILE__, 'wpin_add_customer_role');Добавьте эту функцию в ваш плагин или в functions.php вашей темы и активируйте, чтобы создать новую роль.
Пример полной интеграции
В итоге код для регистрации с выбором роли будет выглядеть так:
<?php
// Добавляем поле выбора роли
function wpin_add_role_select_to_registration() {
$roles = ['subscriber' => 'Подписчик', 'author' => 'Автор', 'customer' => 'Клиент'];
echo '<p><label for="role">Выберите роль</label><br>';
echo '<select name="role" id="role" required>';
foreach ($roles as $role_value => $role_name) {
echo "<option value=\"$role_value\">$role_name</option>";
}
echo '</select></p>';
}
add_action('register_form', 'wpin_add_role_select_to_registration');
// Проверяем выбранную роль
function wpin_validate_role_select($errors, $sanitized_user_login, $user_email) {
if (empty($_POST['role']) || !in_array($_POST['role'], ['subscriber', 'author', 'customer'])) {
$errors->add('role_error', '<strong>Ошибка:</strong> выберите корректную роль.');
}
return $errors;
}
add_filter('registration_errors', 'wpin_validate_role_select', 10, 3);
// Назначаем роль пользователю
function wpin_set_user_role_on_registration($user_id) {
if (!empty($_POST['role']) && in_array($_POST['role'], ['subscriber', 'author', 'customer'])) {
$user = new WP_User($user_id);
$user->set_role(sanitize_text_field($_POST['role']));
}
}
add_action('user_register', 'wpin_set_user_role_on_registration');
// Добавляем кастомную роль customer при активации плагина
function wpin_add_customer_role() {
add_role('customer', 'Клиент', [
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
]);
}
register_activation_hook(__FILE__, 'wpin_add_customer_role');
?>Использование плагинов для расширения функционала
Если не хотите писать код, можно использовать плагины. Например, User Role Editor позволяет создавать и управлять ролями через админку. Также плагин Members даёт гибкий контроль доступа.
Для кастомной регистрации с выбором роли можно использовать плагин WPCommunity от WPShop, который поддерживает расширенную регистрацию и профили.
Дополнительные советы по безопасности
Никогда не доверяйте пользовательским данным без проверки. Используйте sanitize_text_field и другие функции очистки. Также следите, чтобы роли, которые можно выбрать, были разрешены и не давали избыточных прав.
Рекомендуется ограничить список ролей для выбора, чтобы избежать ошибок и уязвимостей.