Регистрация пользователей по ролям в WordPress: практическое руководство

В 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 и другие функции очистки. Также следите, чтобы роли, которые можно выбрать, были разрешены и не давали избыточных прав.

Рекомендуется ограничить список ролей для выбора, чтобы избежать ошибок и уязвимостей.

⭐⭐⭐⭐⭐