Роли и возможности (права) пользователей

WordPress имеет механизм ролей и возможностей, или, иначе говоря, групп пользователей и их прав для того, чтобы контролировать поведение юзеров на сайте, особенно в административной части.

К примеру «Администраторы» — это группа пользователей, а switch_themes (возможность смены темы оформления) уже относится к правам этой группы.

Как обычно я начну от простого к сложному.

1. Роли

В WordPress по умолчанию уже существует 6 групп пользователей:

  • Super Admin — суперадминистратор, который имеет право управлять сетью сайтов.
  • Administrator — администратор.
  • Editor — редактор, может публиковать и редактировать посты других пользователей.
  • Author — автор, может публиковать и редактировать собственные посты.
  • Contributor — участник, может писать и отправлять свои посты на модерацию.
  • Subscriber — подписчик, всё, что он может — это редактировать свой профиль.

Сразу после установки WordPress автоматически создается пользователь-администратор.

Также вы можете установить, какую роль нужно присваивать только что зарегистрированному пользователю. Это настраивается в «Настройки > Общие».

настройка роли нового пользователя

Изменить роль пользователя можно на странице его профиля или же на странице со всеми пользователями:

изменяем роль пользователя

Чуть дальше я покажу, как можно удалить стандартные роли и создать собственную.

2. Возможности

В таблице для экономии места я не стал рассматривать роль суперадминистратора и подписчика. Суперадмин это по сути тот же администратор, только с правами управления сетью сайтов (WordPress Multisite). Чуть ниже я еще напишу про него. А вот про подписчиков не напишу, так как про них и так всё понятно — имеет только одну возможность read.

Возможность Admin Editor Author Contributor
Плагины
install_plugins установка новых плагинов +
update_plugins обновление плагинов +
activate_plugins даёт доступ к странице плагинов +
edit_plugins возможность редактировать файлы плагинов +
delete_plugins удаление плагинов +
Темы
install_themes установка новых тем +
switch_themes изменение активной темы +
edit_themes редактирование файлов темы +
edit_theme_options изменение настроек темы +
update_themes обновление тем +
delete_themes удаление тем +
Настройки WordPress
update_core обновление движка +
import / export возможность пользоваться функциями импорта и экспорта +
manage_options изменение настроек сайта +
edit_dashboard изменения на странице консоли +
Пользователи
create_users создание новых пользователей +
edit_users редактирование пользователей +
delete_users удаление пользователей +
list_users доступ к списку пользователей +
promote_users изменение ролей пользователей +
remove_users удаление пользователей +
Комментарии
moderate_comments модерация комментариев + +
Рубрики
manage_categories изменение рубрик + +
Страницы
edit_pages редактирование страниц + +
edit_others_pages редактирование страниц, созданных другими редакторами + +
edit_published_pages редактирование опубликованных страниц + +
publish_pages публикация страниц + +
delete_pages удаление страниц + +
delete_others_pages удаление страниц других пользователей + +
delete_published_pages удаление опубликованных страниц + +
delete_private_pages удаление личных страниц + +
edit_private_pages редактирование личных страниц + +
read_private_pages просмотр личных страниц + +
Записи
edit_others_posts редактирование постов других пользователей + +
delete_others_posts удаление записей других пользователей + +
delete_private_posts удаление постов, отмеченных как «Личное» + +
edit_private_posts редактирование личных постов + +
read_private_posts просмотр личных постов + +
edit_published_posts редактирование собственных опубликованных записей + + +
publish_posts публикация постов + + +
delete_published_posts удаление собственных опубликованных записей + + +
edit_posts редактирование собственных записей + + + +
delete_posts удаление собственных записей + + + +
Другое
unfiltered_html возможность вставки HTML и JavaScript в посты, страницы, комментарии и виджеты + +
upload_files загрузка файлов + + +
read просмотр сайта + + + +

Как и обещал, остановлюсь чуть подробнее на суперадминистраторах. Обычные администраторы имеют все права на управление своими сайтами. Суперадминистраторы же могут управлять любым сайтом в сети, а также всей сетью в целом.

У них есть несколько собственных возможностей:

  • manage_network дает доступ в консоль сети,
  • manage_sites доступ к странице управления сайтами сети,
  • manage_network_users возможность управления пользователями сети,
  • manage_network_themes управление темами сети,
  • manage_network_options доступ к параметрам сети;

3. Уровни

Начиная с версии WordPress 3.0 уровни пользователей больше не используются!

4. Функции для работы с ролями и возможностями пользователей

add_role() — создание собственной роли

Функция заносит данные в базу, поэтому лучше всего её использовать только один раз, например при активации плагина или темы.

/*
 * допустим я добавлю этот код в файл плагина и сделаю так, чтобы он запускался при активации этого самого плагина
 */
register_activation_hook( __FILE__, 'true_new_role_plugin_activate' );
 
function true_new_role_plugin_activate() {
	$new_role = add_role(
		'comm_moderator', // название роли
		__( 'Comment Moderator' ), // отображаемое название роли (модератор комментариев)
		array( // массив возможностей, true - разрешено, false - запрещено
			'read'         => true,  // ну это понятно
			'moderate_comments'=> true // разрешим модерировать комментарии
		)
	);
	if ( null !== $result ) { // смотрим результат
		// роль успешно создана
	} else { 
		// если null, то значит роль уже существует
	}
}

remove_role() — удаление ролей

Также, как и add_role(), функция изменяет содержимое базы данных — а значит не нужно просто тупо вставлять её в functions.php.

В примере удалим роль, созданную в прошлой главе:

remove_role('comm_moderator'); // в качестве параметра указываем название роли и всё, дело сделано

get_role() — получение информации о группе пользователей

В случае успеха возвращает объект WP_Role (который состоит преимущественно из возможностей роли), в случае неудачи — null.

$my_role = get_role( 'comm_moderator' ); // указываем роль, которая нам нужна
print_r( $my_role ); // так можно вывести содержимое объекта

add_cap() и remove_cap() — добавление и удаление возможностей

Благодаря этим функциям вы можете добавить или удалить права для пользователей определенной роли или даже для пользователей с определенными ID.

Эти функции также изменяют содержимое базы данных, поэтому в качестве примера мы повесим их на активацию / деактивацию темы.

function true_author_caps(){
	global $pagenow;
	$role = get_role( 'author' ); // к примеру возьмем роль автора
	// $role = new WP_User( $user_id ); таким образом мы можем взять конкретного пользователя
	if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) ){ // если тема была активирована
		$role->add_cap( 'edit_others_posts' ); // разрешаем авторам редактировать посты других авторов
	} else { // если тема деактивирована
		$role->remove_cap( 'edit_others_posts' ); 
	}
}
 
add_action( 'load-themes.php', 'true_author_caps' ); // вешаем функцию на хук
Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 8

  • Леонид9 сентября 2015 в 10:09 #

    Здравствуйте, как определенному пользователю дать возможность публиковать посты только в определенную рубрику?

    • Миша10 сентября 2015 в 13:09 #

      Здравствуйте!
      А каким образом вы хотите это реализовать? Сделать другие рубрики в админки недоступными для выбора или как-то ещё?

      • Максим30 декабря 2015 в 23:12 #

        Совершенно верно, чтобы пользователи могли публиковать посты только в одну рубрику, остальные не выводились ему в админке.

  • Артем13 января 2016 в 15:01 #

    Приветствую, Михаил! Немного не в кассу, но спрошу.
    Можно ли задать возможности определенной роли чтобы этим пользователям можно было только добавлять и редактировать одну конкретную кастомную запись?

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...