WordPress как на ладони
wordpress jino

current_user_can() WP 2.0 current user can

Проверяет права текущего пользователя, совершать указанное действие.

Когда нужно проверить право указанного, а не текущего пользователя, используйте user_can().

Используется в: get_edit_post_link().
Работает на основе: wp_get_current_user()
✈ 1 раз = 0.000049с = очень быстро | 50000 раз = 0.62с = очень быстро PHP 7.0.5, WP 4.5.2

Хуков нет.

Возвращает

true/false. true — есть права, false — нет прав.

Использование

if( current_user_can( $capability, $args ) ){
	// есть право...    
}

Параметры

$capability(строка) (обязательный)
Название возможности или роли. Список возможностей и ролей смотрите здесь.
По умолчанию: нет
$args(смешанный)
Дополнительные аргументы, которые могут понадобится, например, ID поста. Некоторые проверки возможностей нуждаются в таких аргументах (например, 'edit_post' или 'delete_page').
По умолчанию: нет

Базовый список прав

Право Супер Админ Админ Редактор Автор Участник Подписчик
manage_network да
manage_sites да
manage_network_users да
manage_network_plugins да
manage_network_themes да
manage_network_options да
Право Супер Админ Админ Редактор Автор Участник Подписчик
activate_plugins да да (один сайт или включается в настройках сети)
create_users да да (один сайт)
delete_plugins да да (один сайт)
delete_themes да да (один сайт)
delete_users да да (один сайт)
edit_files да да (один сайт)
edit_plugins да да (один сайт)
edit_theme_options да да
edit_themes да да (один сайт)
edit_users да да (один сайт)
export да да
import да да
install_plugins да да (один сайт)
install_themes да да (один сайт)
list_users да да
manage_options да да
promote_users да да
remove_users да да
switch_themes да да
update_core да да (один сайт)
update_plugins да да (один сайт)
update_themes да да (один сайт)
edit_dashboard да да
Право Супер Админ Админ Редактор Автор Участник Подписчик
unfiltered_html да да (один сайт) да (один сайт)
moderate_comments да да да
manage_categories да да да
manage_links да да да
edit_others_posts да да да
edit_pages да да да
edit_others_pages да да да
edit_published_pages да да да
publish_pages да да да
delete_pages да да да
delete_others_pages да да да
delete_published_pages да да да
delete_others_posts да да да
delete_private_posts да да да
edit_private_posts да да да
read_private_posts да да да
delete_private_pages да да да
edit_private_pages да да да
read_private_pages да да да
Право Супер Админ Админ Редактор Автор Участник Подписчик
edit_published_posts да да да да
upload_files да да да да
publish_posts да да да да
delete_published_posts да да да да
edit_posts да да да да да
delete_posts да да да да да
read да да да да да да

Подробнее на официальной странице

к началу

Мета права

Выше перечислен список фундаментальных прав. Но есть еще так называемые мета-права. Им указывается дополнительные параметры (например право редактировать запись). Для таких прав WP делает дополнительную проверку, чтобы узнать может ли пользователь совершать действие. Например:

if( current_user_can('edit_post', 123) ) {
	 echo 'Текущий пользователь может редактировать пост 123'.
}

Список мета-прав:

  • delete_user
  • edit_user
  • remove_user
  • promote_user
  • delete_post
  • delete_page
  • edit_post
  • edit_page
  • read_post
  • read_page
  • edit_term (с WP 4.7)
  • delete_term (с WP 4.7)
  • assign_term (с WP 4.7)

Подробнее о мета правах читайте в описании map_meta_cap()

к началу

Примеры

#1. Проверим администратор пользователь или нет:

// проверим возможность
if( current_user_can('manage_options') ){
	echo "У пользователя есть права изменять настройки";
}

#2. Используем user_can(), чтобы проверить права текущего пользователя:

// определяем пользователя глобально
global $user;
if( user_can($user->ID, 'manage_options') ){
	// делаем что-то что может пользователь с этими правами
};

manage_options - права администратора

#3. Пример использования второго аргумента $args:

if( current_user_can('edit_post', 123) ) {
	 echo 'Текущий пользователь может редактировать пост 123'.
}

#4. Проверка прав для отдельного элемента таксономии

C версии 4.7. Стало возможным проверять права для отдельного термина. Для этого нужно использовать права: edit_term, delete_term, assign_term.

Например, давайте выведем ссылку на редактирование элемента таксономии, только если текущий текущий пользователь имеет такое право.

if( current_user_can('edit_term', $term_id) ){
	echo '<a href="'. get_edit_term_link( $term_id ) .'">Редакт.</a>';
}

Проверка роли текущего пользователя

Не используйте название роли в current_user_can(), потому что проверка может работать неправильно. Пример, как делать не следует:

// если текущий пользователь редактор (editor), то функция вернет:
current_user_can('administrator') // false
current_user_can('editor') // true
current_user_can('contributor') // false
current_user_can('subscriber') // false

#1 Функция проверки роли

Вместо этого вы можете воспользоваться функцией проверки роли текущего пользователя:

/**
 * Проверяет роль определенного пользователя. 
 * Возвращает true при совпадении.
 *
 * @param строка $role Название роли.
 * @param логический $user_id (не обязательный) ID пользователя, роль которого нужно проверить.
 * @return bool
 */
function is_user_role( $role, $user_id = null ) {
	$user = is_numeric( $user_id ) ? get_userdata( $user_id ) : wp_get_current_user();

	if( ! $user )
		return false;

	return in_array( $role, (array) $user->roles );
}

// Пример использования для текущего пользователя
if( is_user_role( 'customer' ) )
	echo "есть доступ";
else
	echo "нет доступа";

// Пример использования для определенного пользователя
$user_id = 23;

if ( is_user_role( 'customer', $user_id ) )
	echo "У вас есть доступ";
else
	echo "У вас нет доступа";
к началу

#2 Еще одна функцию проверки ролей текущего пользователя

Эту функцию я написал в процессе работы над одним из проектов, теперь её периодически использую.

## Проверяет есть указанная роль в ролях текущего/указанного пользователя
## $roles строка/массив - название роли которую нужно проверить у текущего пользователя
function is_user_role_in( $roles, $user = false ){
	if( ! $user )           $user = wp_get_current_user();
	if( is_numeric($user) ) $user = get_userdata( $user );

	if( empty($user->ID) )
		return false;

	foreach( (array) $roles as $role )
		if( isset($user->caps[ $role ]) || in_array($role, $user->roles) )
			return true;

	return false;
}

// Пример использования
if( is_user_role_in(['new_role','new_role2']) )
	echo 'Роль текущего пользователя new_role или new_role2';

if( is_user_role_in(['new_role','new_role2'], 5) )
	echo 'Роль пользователя 5 new_role или new_role2';

Код из wp-includes/capabilities.php WP 4.7.3

<?php
function current_user_can( $capability ) {
	$current_user = wp_get_current_user();

	if ( empty( $current_user ) )
		return false;

	$args = array_slice( func_get_args(), 1 );
	$args = array_merge( array( $capability ), $args );

	return call_user_func_array( array( $current_user, 'has_cap' ), $args );
}

Связанные Функции

Из метки: Роли и возможности (role capabilities)

Еще из метки: _user

Еще из раздела: Роли и возможности

current_user_can 9 комментариев
  • Дмитрий

    if( is_user_role_in(['new_role','new_role2']) )

    wp что-то ругается на квадратные скобочки

    Ответить4 месяца назад #
    • Kama4192

      Это версия PHP 5.3 или меньше... Замени на:

      is_user_role_in( array('new_role','new_role2') )
      Ответить4 месяца назад #
  • Юрий cайт: youjin.ua

    добрый день, как настроить, чтобы "Редактор" мог модерировать комментарии? Сейчас, залогинившись, он может только читать их.

    Ответить3 месяца назад #
  • Дмитрий М
    @

    Доброе время суток!
    У меня такой вопрос:
    Если создан произвольный тип записей и в нем указан массив capabilities по принципу:

    capabilities = array(
    'edit_post' => 'edit_costum_post_type',
    'publish_post' => 'publish_costum_post_type',
    ...... );

    Будет ли работать current_user_can('edit_costum_post_type', 123)?

    Ответитьмесяц назад #
    • Дмитрий М
      @

      Прошу прощения за беспокойство, я проверил - конструкция работает.

      Ответитьмесяц назад #
      • Kama4192

        Более того, можно указать current_user_can('edit_post', 123) и это будет равносильно проверке current_user_can('edit_costum_post_type', 123)

        Ответитьмесяц назад #
        1
  • Bloody

    Здравствуйте. Извините если не совсем по теме. Не знаю, где найти, узнать, как сделать проверку, является ли авторизованный пользователь владельцем данной страницы (в частности страницы автора), для того чтобы конкретно он видел на самой странице кнопку редактировать профиль, а другие, не владельцы страницы не видели её, или видели что то другое? Помогите если можете, спасибо.

    Ответитьмесяц назад #
    • Дмитрий М
      @

      Вам надо получить данные, автора поста (к примеру "name" или "email") с помощью $author_mail =get_the_author_meta("user_email");, потом сравнить с данными из global $current_user;, т.е.:

      if (is_user_logged_in()){
      	global $current_user;
      	$author_mail =get_the_author_meta("user_email");
      	if ($current_user->user_email == $author_mail){
      		//человек - есть автор поста
      	} else{
      		//человек - не автор поста
      	}
      }
      Ответитьмесяц назад #
      2
  • Евгений
    @

    Подскажите решение такой задачи. Я закрываю доступ к wp-admin всем кроме админа при помощи такого кода

    add_action( 'init', 'blockusers_init' );
     function blockusers_init() {
     if ( is_admin() && ! current_user_can( 'administrator' ) &&
     ! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
     wp_redirect( '404' );
     exit;
     }
     }

    но возникла ситуация, что помимо админа, надо еще открыть доступ авторам и редакторам, подскажите что подправить в коде?

    Ответить20 дней назад #

Здравствуйте, !

Ваш комментарий