map_meta_cap
Дозволяє змінити можливості користувача на основі поточних даних про права.
Хук спрацьовує наприкінці функції current_user_can() . Хук дозволяє додатково перевірити право користувача та дозволити чи заборонити виконувати поточну дію.
Використання
add_filter( 'map_meta_cap', 'wp_kama_map_meta_cap_filter', 10, 4); /** * Function for `map_meta_cap` filter-hook. * * @param string[] $caps Primitive capabilities required of the user. * @param string $cap Capability being checked. * @param int $user_id The user ID. * @param array $args Adds context до здатності check, типово starting with object ID. * * @return string[] */ function wp_kama_map_meta_cap_filter( $caps, $cap, $user_id, $args ){ // Filter... return $caps; }
-
$caps
(масив) -
Містить масив поточних примітивних прав користувача, які були визначені в результаті перевірки прав доступу через
current_user_can() або
user_can() Наприклад:
array( [0] => edit_published_posts )
. -
$cap
(рядок) -
Поточна назва права, що перевіряється, наприклад:
edit_post (мета право) або
edit_posts (примітивне право). -
$user_id
(число) - ID користувача для якого перевіряється можливість.
-
$args
(масив) Додаткові параметри, зазначені у функцію перевірки права. Наприклад, тут будуть утримуватися всі параметри, крім першого параметра вказані у функції current_user_can() .
Зазвичай цей масив містить один елемент – ID об’єкта, котрій перевіряється право. Наприклад при current_user_can( ‘edit_post’, 123 ) цей параметр дорівнюватиме:
array( [0] => 123 )
.
Приклади
#1 Приклад використання фільтра map_meta_cap
Цей приклад показує, як можна додатково відкрити доступ користувача для виконання будь-яких дій. В даному випадку відкрити доступ до редагування запису для передплатника з фронту.
Передбачається, що запис можна редагувати з фронт-енду і перевірка на цю можливість робиться стандартно: current_user_can(‘edit_post’, $post_id);
// дозволяємо редагувати пост передплатнику, якщо він автор посту та з часу публікації посту не пройшло більше X місяців !is_admin() && add_filter( 'map_meta_cap', 'allow_subscribers_edit_self_posts', 10, 4 ); function allow_subscribers_edit_self_posts( $caps, $cap, $user_id, $args ){ // print_r($caps); // [0] => edit_published_posts // print_r($cap); // edit_post // print_r ($ user_id); // 80 // print_r ($ args); // [0] => 913 if( $cap === 'edit_post' && $caps[0] === 'edit_published_posts' ){ $post = get_post($args[0]); // дозволяємо редагувати пост, якщо це автор посту та з часу публікації посту пройшло не більше 2 місяців if( $post->post_author && $user_id == $post->post_author && get_userdata($user_id)->roles[0] === 'subscriber' && ( time() < ( MONTH_IN_SECONDS*2 + strtotime($post->post_date_gmt) ) ) ) { $caps[0] = 'read'; } } return $caps; }
#2 Дозволимо певним користувачам редагувати чужі записи
Допустимо, автори публікують проекти (Записи) та в метаполі вказують ID трекера (кастомна роль), який потім зможе редагувати їхні проекти.
add_filter( 'map_meta_cap', 'allow_tracker_edit_posts', 10, 4); /** * Дозволяє Трекерам редагувати записи підопічних. * * @param array $caps * @param string $cap * @param int $user_id * @param array $args * * @return array */ function allow_tracker_edit_posts( $caps, $cap, $user_id, $args ) { if ( // Працюємо тільки з потрібною мета-можливістю $cap === 'edit_post' // ID поточного користувача повинен збігатися з тим, що в меті запису && (int) get_post( $args[0] )->project_tracker === $user_id // Роль поточного користувача, котрому треба додати можливість && get_userdata( $user_id )->has_cap('project_tracker') ) { $caps[0] = 'edit_posts'; // Додаємо фундаментальну можливість (право) } return $caps; }
список змін
З версії 2.8.0 | Введено. |