Intereting Posts
Что бы сделать процесс обновления плагина завершенным, но не сообщать как таковое? Удалить строку пользовательской таблицы в WordPress с помощью AJAX Есть ли способ для плагина получить собственный номер версии? Как добавить пользовательский класс в get_avatar () Использование / wp-admin работает, используя / login дает 404. Почему? Подсчет позиций цикла (WP_Query)? Пользовательские css для каждой категории и для одной записи относятся к каждой категории Нет доступа к wp-admin и Dashboard Как исправить ошибку «извините, вы не можете получить доступ к этой странице» Я получаю ссылки «plugins> settings»? Разработка плагина, где размещать манипуляторы и т. Д.? WP_Query для получения сообщений из продуктов WooCommerce, которые находятся только в каталоге Как WordPress создает свою базу данных во время установки? Woocommerce вызывать API внешнего рынка? Измените основной цикл WordPress с помощью фильтра parse_query Получать сообщения по типу пользовательской публикации, таксономии и сроку

Временная возможность для current_user_can ()

Можно ли перехватить вызовы на current_user_can ()?

Пример:

current_user_can('rate', $post_id)

Нет возможности зарегистрировать «скорость», но могу ли я как-то подключиться к этой функции и выполнить свои собственные проверки, не регистрируя возможности роли?

Solutions Collecting From Web of "Временная возможность для current_user_can ()"

Да, просто отфильтруйте 'user_has_cap' . Вы получаете массив с текущими возможностями, которые вы можете изменить, не касаясь базы данных.

Образец кода

 add_filter( 'user_has_cap', 'wpse_53230_catch_cap', 10, 3 ); /** * See WP_User::has_cap() in wp-includes/capabilities.php * * @param array $allcaps Existing capabilities for the user * @param string $caps Capabilities provided by map_meta_cap() * @param array $args Arguments for current_user_can() * @return array */ function wpse_53230_catch_cap( $allcaps, $caps, $args ) { // $args[2] is the post ID if($args[0] !== 'beat_chuck_norris' || !isset($args[2]) || !my_checks($args[2])) return $allcaps; $allcaps['beat_chuck_norris'] = 1; return $allcaps; } function my_checks($post_id){ // here check if the current user can rate this post return true; } 

Контрольная работа

 current_user_can( 'beat_chuck_norris', get_the_ID() ) and print 'The current user can beat Chuck Norris. Be nice to her!'; 

Руководители супер-админов

 add_filter('map_meta_cap', 'wpse_53230_catch_cap_for_sa', 10, 4); function wpse_53230_catch_cap_for_sa($caps, $req_cap, $user_id, $args){ if(is_multisite() && is_super_admin($user_id) && ($req_cap === 'beat_chuck_norris') && !empty($args[0]) // here post ID is $args[0] && !my_checks($args[0]) ){ $caps[] = 'do_not_allow'; } return $caps; }