Добавление права пользователю налету
Обычно права ролям выставляются при регистрации роли, а дополнительные права отдельным пользователям можно добавить с помощью плагина 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 'Право есть.';
}