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);