Фильтр user_has_cap
в WordPress позволяет динамически изменять права пользователей. Это полезный инструмент для гибкой настройки возможностей в зависимости от условий, роли пользователя или других параметров.
apply_filters( 'user_has_cap', bool[] $allcaps, string[] $caps, array $args, WP_User $user )
Параметры
$allcaps
(массивbool[]
) — Все права пользователя. Массив пар ключ => значение, где ключ — это имя права, а значениеtrue
илиfalse
, обозначающее, есть ли у пользователя это право.$caps
(массивstring[]
) — Минимально необходимые права для проверки.$args
(массивarray
) — Дополнительные аргументы. Обычно включает:[0]
— Запрашиваемое право.[1]
— ID пользователя.[2]
— ID объекта, с которым связана проверка.
$user
(объектWP_User
) — Объект текущего пользователя, права которого проверяются.
Пример использования: Динамическое добавление прав по ID пользователя
Этот пример демонстрирует добавление права пользователю с определенным ID. Например, мы хотим предоставить пользователю с ID 7
право на доступ к специфичной функции, недоступной остальным пользователям.
add_filter( 'user_has_cap', 'add_special_capability', 10, 4 );
function add_special_capability( $allcaps, $caps, $args, $user ) {
if ( $user->ID === 7 ) {
$allcaps['special_capability'] = true; // Добавляем право
}
return $allcaps;
}
Теперь для проверки этого права можно использовать:
if ( current_user_can( 'special_capability' ) ) {
echo 'Пользователь имеет специальное право.';
}
Пример 2: Назначение прав в зависимости от роли пользователя
В данном примере права будут меняться в зависимости от роли пользователя. Например, мы добавляем возможность видеть дополнительные мета-информацию и редактировать посты для роли project_leader
.
add_filter( 'user_has_cap', 'modify_capabilities_based_on_role', 10, 4 );
function modify_capabilities_based_on_role( $allcaps, $caps, $args, $user ) {
if ( in_array( 'project_leader', (array) $user->roles, true ) ) {
$allcaps['edit_posts'] = true;
$allcaps['view_custom_meta'] = true;
}
if ( in_array( 'project_viewer', (array) $user->roles, true ) ) {
$allcaps['read'] = true;
$allcaps['view_custom_meta'] = true;
}
return $allcaps;
}
Пример 3: Разрешение неавторизованному пользователю изменять пост
Иногда может потребоваться, чтобы неавторизованные пользователи могли обновлять посты. Этот код добавляет неавторизованному пользователю право на редактирование конкретного поста.
add_filter( 'user_has_cap', 'grant_edit_permission_to_unauthenticated', 10, 4 );
function grant_edit_permission_to_unauthenticated( $allcaps, $caps, $args, $user ) {
if ( ! is_user_logged_in() && isset( $args[0] ) && $args[0] === 'edit_post' && $args[2] === 123 ) {
$allcaps['edit_post'] = true;
}
return $allcaps;
}
$post_data = [
'ID' => 123,
'post_content' => 'Обновленный контент для неавторизованного пользователя',
];
wp_update_post( $post_data );
Заключение
Фильтр user_has_cap
позволяет гибко настраивать права в WordPress на лету, не изменяя глобальные настройки базы данных.