Добавление права пользователю налету
Обычно права ролям выставляются при регистрации роли, а дополнительные права отдельным пользователям можно добавить с помощью плагина 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; }
Рассмотрим еще один пример посложнее. Этот пример проверят роль текущего пользователя и тут же добавляет новые права (возможности) в список прав юзера, в зависимости от текущей роли пользователя (название роли пользователя хранится в общем списке прав пользователя).
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 ] ) ) { // WordPress $allcaps['read'] = true; } // Руководитель $role = 'project_leader'; if ( ! empty( $allcaps[ $role ] ) ) { // WordPress $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 ] ) ) { // WordPress $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 ] ) ) { // WordPress $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 'Право есть.'; }