Добавление прав пользователей “на лету” в WordPress: примеры и инструкции

Добавление прав пользователей "на лету"

В WordPress обычно права ролей назначаются во время их регистрации. Дополнительные права для отдельных пользователей можно добавить с помощью плагина User Role Editor. Однако, иногда удобнее назначать права динамически, не внося изменения в базу данных. Это может быть полезно на проектах, где права постоянно добавляются или убираются.

В этой статье мы рассмотрим, как добавить права "на лету" с помощью хука user_has_cap. Это позволяет изменять права пользователей в коде и видеть результаты сразу.

Простое добавление права

Давайте рассмотрим простой пример, в котором мы добавляем право some_capability пользователю с ID 5:

add_filter( 'user_has_cap', 'maybe_grant_some_capability_cap', 1, 4 );

function maybe_grant_some_capability_cap( $allcaps, $caps, $args, $user ) {
    if ( 5 === (int) $user->ID ) {
        $allcaps['some_capability'] = true;
    }
    return $allcaps;
}

В этом примере мы используем хук user_has_cap, чтобы добавить новое право для пользователя с ID 5.

Более сложный пример

Теперь рассмотрим более сложный пример, который проверяет роль текущего пользователя и добавляет новые права в зависимости от этой роли. Название роли хранится в общем списке прав пользователя.

add_filter( 'user_has_cap', 'kama_user_has_cap', 10, 4 );

/**
 * Изменяет права ролей "на лету".
 *
 * @param array   $allcaps  Все права пользователя.
 * @param array   $caps     Права, которые проверяются.
 * @param array   $args     Дополнительные аргументы.
 * @param WP_User $user     Объект пользователя.
 *
 * @return array  Обновленный массив прав.
 */
function kama_user_has_cap( $allcaps, $caps, $args, $user ) {

    // Роль трекера (неконфирмированная)
    $role = 'project_tracker_fake';
    if ( ! empty( $allcaps[ $role ] ) ) {
        $allcaps['read'] = true; // Право читать
    }

    // Роль лидера проекта
    $role = 'project_leader';
    if ( ! empty( $allcaps[ $role ] ) ) {
        $allcaps['read'] = true; // Право читать
        $allcaps['edit_posts'] = true; // Право редактировать записи
        $allcaps['edit_published_posts'] = true; // Право редактировать опубликованные записи

        // Дополнительные права
        $allcaps['view_expert_note'] = true; // Смотреть экспертную заметку
        $allcaps['view_expert_comment'] = true; // Смотреть комментарий эксперта
        $allcaps['view_moderator_note'] = true; // Смотреть заметку модератора
    }

    // Роль трекера проекта
    $role = 'project_tracker';
    if ( ! empty( $allcaps[ $role ] ) ) {
        $allcaps['read'] = true; // Право читать
        $allcaps['edit_posts'] = true; // Право редактировать записи
        $allcaps['edit_published_posts'] = true; // Право редактировать опубликованные записи
        $allcaps['view_post_contacts'] = true; // Смотреть контакты

        // Дополнительные права
        $allcaps['view_expert_note'] = true; // Смотреть экспертную заметку
        $allcaps['view_expert_comment'] = true; // Смотреть комментарий эксперта
        $allcaps['view_expert_rating'] = true; // Смотреть рейтинг эксперта
        $allcaps['view_moderator_note'] = true; // Смотреть заметку модератора
    }

    // Роль эксперта
    $role = 'project_expert';
    if ( ! empty( $allcaps[ $role ] ) ) {
        $allcaps['read'] = true; // Право читать
        $allcaps['edit_posts'] = true; // Право редактировать записи
        $allcaps['delete_others_posts'] = false; // Нет права удалять записи других пользователей
        $allcaps['edit_others_posts'] = true; // Право редактировать записи других пользователей
        $allcaps['view_post_contacts'] = true; // Смотреть контакты

        // Дополнительные права
        $allcaps['view_moderator_note'] = true; // Смотреть заметку модератора
        $allcaps['view_expert_note'] = true; // Смотреть экспертную заметку
        $allcaps['view_expert_comment'] = true; // Смотреть комментарий эксперта
        $allcaps['view_expert_rating'] = true; // Смотреть рейтинг эксперта
        $allcaps['add_expert_note'] = true; // Редактировать экспертную заметку
        $allcaps['add_expert_comment'] = true; // Редактировать комментарий эксперта
        $allcaps['add_expert_rating'] = true; // Редактировать рейтинг эксперта
    }

    return $allcaps;
}

В этом примере мы проверяем роль пользователя и добавляем соответствующие права в зависимости от этой роли.

Проверка прав пользователя

Теперь вы можете проверить, есть ли у пользователя право add_expert_rating, следующим образом:

if( current_user_can( 'add_expert_rating' ) ){
    echo 'Право доступно.';
}

Этот код проверяет, имеет ли текущий пользователь право на добавление рейтинга эксперта, и выводит сообщение, если право есть.

Заключение

Используя хук user_has_cap, вы можете динамически изменять права пользователей в вашем проекте на WordPress. Это особенно полезно для проектов с быстро меняющимися потребностями в управлении правами.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *