user_has_cap
Дозволяє видалити/додати нові права (можливості) окремому користувачеві.
Цей хук також працюватиме і для неавторизованих користувачів. Права перевіряються і для них, лише за умовчанням у списку прав неавторизованих користувачів порожньо, але ми можемо і їм дозволити виконувати якісь дії. Кейс коли це може стати в нагоді див. у прикладі .
Використання
add_filter( 'user_has_cap', 'wp_kama_user_has_cap_filter', 10, 4);
/**
* Function for `user_has_cap` filter-hook.
*
* @param bool[] $allcaps Array of key/value pairs where keys represent a capability name і boolean values represent whether the user has that capability.
* @param string[] $caps Потрібні primitive capabilities for the requested capability.
* @param array $args Arguments that accompany the requested capability check.
* @param WP_User $user The user object.
*
* @return bool[]
*/
function wp_kama_user_has_cap_filter( $allcaps, $caps, $args, $user ){
// Filter...
return $allcaps;
}- $allcaps
(масив) Масив усіх можливостей користувача.
Масив пар
ключ => значение, де ключі представляють ім’я можливості, а логічне значення true/false показує, чи має користувач цю можливість.- $caps
(масив) - Примітивні права для можливості, що запитується. Те, що повертає
map_meta_cap() . - $args
(масив) - Додаткові параметри передані в
current_user_can() або
WP_User::has_cap() , зазвичай це ID об’єкта (поста/коменту/користувача). - $user
(WP_User) - Об’єкт користувача, права якого фільтруються.
Приклади
#1 Додамо назви прав до списку прав користувачів на льоту
Зазвичай права ролям виставляються під час реєстрації ролі, а додаткові права окремим користувачам можна додати з допомогою плагіна 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 === $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 'Право є.';
}#2 Дозволимо оновлювати пост не авторизованому користувачеві {#allows-for-unauthorized}
Припустимо, у нас такий випадок, що на фронті неавторизовані користувачі можуть оновлювати якісь конкретні дані посту, наприклад, додавати мітки до нього. Для оновлення посту ми використовуємо функцію wp_update_post() .
За умовчанням ВП не дозволить це зробити неавторизованому користувачеві, але нам потрібно надати таке право. Для цього вішаємо функцію на хук user_has_capі функції додаємо право редагувати пост.
Ми не боїмося що, користувач якось зможе нашкодити, тому що ми самі встановлюємо поля, які потрібно оновити для посту і попередньо їх очищаємо.
Наприклад, на запит аякс ми приймаємо назву елемента таксономії і хочемо додати його для посту:
// ... тут код отримання GET/POST даних
// дозволяємо будь-якому користувачеві оновлювати будь-які пости (зокрема наш)
add_filter( 'user_has_cap', 'add_editor_cap_for_unauthorizes_user' );
function add_editor_cap_hb( $allcaps ){
$allcaps['edit_posts'] = true;
return $allcaps;
}
$post_data = [
'ID' => 654,
'tax_input' = [
'tax_name' => [ 'Term Name' ],
],
];
// оновлюємо
wp_update_post(wp_slash($post_data));
// скасовуємо дозвіл
remove_filter( 'user_has_cap', 'add_editor_cap_for_unauthorizes_user' );
// ... якийсь ще код
список змін
| З версії 2.0.0 | Введено. |
| З версії 3.7.0 | Added the $user parameter. |
Де викликається хук
Де використовується хук у WordPress
add_filter( 'user_has_cap', 'wp_maybe_grant_install_languages_cap', 1);
add_filter( 'user_has_cap', 'wp_maybe_grant_resume_extensions_caps', 1);
add_filter( 'user_has_cap', 'wp_maybe_grant_site_health_caps', 1, 4);