WordPress использует механизм Ролей пользователей, суть которого заключается в том, чтобы дать возможность контроля, что другие пользователи сайта могут или не могут делать в админке, например публиковать свои посты, создавать страницы, устанавливать плагины, темы, редактировать других пользователей и так далее.
У каждой роли есть свой набор прав, о которых мы поговорим чуть ниже, к примеру «Администраторы» — это группа пользователей, а switch_themes (возможность смены темы оформления) уже относится к правам этой группы.
Роли пользователей
В WordPress по умолчанию уже существует 6 групп (ролей) пользователей:
А если у вас стоит плагин для интернет-магазинов WooCommerce, то у вас будет ещё две дополнительные роли, о них я рассказываю в отдельном уроке.
Сразу после установки WordPress автоматически создается пользователь-администратор.
Также вы можете установить, какую роль нужно присваивать только что зарегистрированному пользователю. Это настраивается в «Настройки > Общие».
Изменить роль пользователя можно на странице его профиля или же на странице со всеми пользователями:
Чуть дальше я покажу, как можно удалить эти роли, да и вообще, создать собственные.
Но сначала давайте чуть подробнее остановимся на стандартных ролях пользователей.
Администратор (administrator)
Вот так выглядит админка администраторов (рекомендую обратить внимание именно на меню слева).
Если мы не говорим о сети сайтов WordPress Мультисайт, то администраторы могут всё – устанавливать плагины и темы, редактировать весь контент и настройки, создавать и удалять пользователей, сбрасывать пароли и так далее. Полный список их прав в таблице ниже.
Редактор (editor)
Редакторы – это такие ребята, которые не имеют доступ к настройкам и плагинам сайта, зато имеют полный доступ к любому контенту и могут создавать и редакторивать как свои посты, так и чужие. А также модерировать комментарии и редактировать категории и метки.
Автор (author)
Авторы могут публиковать и редактировать только свои собственные посты типа «Записи». И удалять кстати тоже. То есть у них уже нет доступа к Страницам. И не могут создавать новые рубрики и метки.
Участник (contributor)
Что-то типо облегчённой версии роли автора. Могут писать и редактировать посты в виде черновиков, но при публикации посты должны пройти одобрение администраторами или редакторами. Кроме того, не могут изменить свои же, уже опубликованные посты и загружать медиафайлы.
Подписчик (subscriber)
Ну и последняя стандартная роль WordPress – подписчик, который не может ровным счётом ничего 😁 Ну окей, они могут изменять информацию в своём профиле и читать посты, на этом всё.
Супер-администратор
Вы наверное подумали: «Так, а где роль суперадмина?» Почему я не рассказал про неё в самом начале? А это даже и не совсем роль – это роль администратора с возможностью управления сетью WordPress Мультисайт.
У него появляется доступ в отдельную консоль для мультисайта.
Таблица ролей и прав пользователей
Для того, чтобы вам было удобнее ориентироваться в огромном количестве прав пользователей, сделал для вас таблицу. Не забывайте кликать на ссылку-название определённого права, чтобы почитать про него подробнее, так как для некоторых прав существуют различные условия, когда они работают по-другому.
Примитивные и Мета-права
Сейчас пришло время рассказать вам о важном моменте, связанном с правами пользователя. Я также упоминал о нём, когда описывал функцию register_post_type().
Чтобы понять, как это работает, лучше всего обратиться к примеру.
Предположим, что у нас есть какое-то право, допустим это edit_posts. И мы например можем проверить функцией current_user_can(), может ли текущий пользователь в принципе редактировать посты или нет. Это примитивное право, под него попадают все возможные посты. Это можно проверить:
if( current_user_can( 'edit_posts' ) ) { }
Но как вы знаете, у нас есть например роль Авторы, которые могут редактировать только свои посты. Как проверить, что они это могут делать? При помощи мета-права!
if( current_user_can( 'edit_post', $post->ID ) ) { }
Мета-права создаются «на лету» динамически, например алгоритм такой, что WordPress чекает, может ли пользователь редактировать чужие посты примитивным правом edit_others_posts
, если нет, то он проверяет, является ли пользователь автором проверяемого поста $post->ID
. И вот так это и работает.
Права пользователей
switch_themes
edit_themes
edit_theme_options
install_themes
delete_themes
update_themes
activate_plugins
edit_plugins
install_plugins
edit_users
manage_options
moderate_comments
manage_categories
manage_links
upload_files
import
export
unfiltered_html
А вообще кстати мы можем изменять список разрешённых HTML-тегов в постах и комментариях.
edit_posts
edit_others_posts
edit_published_posts
publish_posts
delete_posts
delete_others_posts
delete_published_posts
delete_private_posts
edit_private_posts
read_private_posts
edit_pages
publish_pages
edit_others_pages
edit_published_pages
delete_pages
delete_others_pages
delete_published_pages
edit_private_pages
read_private_pages
delete_private_pages
delete_users
create_users
list_users
remove_users
promote_users
unfiltered_upload
С версии 2.3.
Право unfiltered_upload
очень похоже на unfiltered_html. Если у пользователя присутствует это право, он(а) сможет загружать файлы, которые НЕ находятся в белом списке WordPress:
В итоге, если у пользователя нет данного разрешения, то попытки загрузить любые файлы, который не находятся в этом списке, приведут к ошибке «Извините, этот тип файла недопустим по соображениям безопасности»:
По умолчанию этого права нет ни у кого, но его можно включить, добавив в wp-config.php
следующую строчку:
define( 'ALLOW_UNFILTERED_UPLOADS', true );
На обычной установке WordPress это право можно добавить для кого угодно, а на мультисайт-установке – только для супер-админов.
edit_dashboard
customize
delete_site
update_plugins
delete_plugins
update_core
edit_comment
create_sites
delete_sites
manage_network
manage_sites
manage_network_users
manage_network_themes
manage_network_options
manage_network_plugins
upload_plugins
upload_themes
upgrade_network
setup_network
read
Примеры работы с ролями и правами пользователей
Проверка роли или права пользователя
Для того, чтобы в коде проверить, имеет ли пользователь сайта определённую роль или же только определённое право, мы можем воспользоваться одной из двух функций:
Проверим, что текущий пользователь администратор:
if( current_user_can( 'administrator' ) ) { // выполняем какие-либо действия }
Или:
if( user_can( get_current_user_id(), 'administrator' ) ) { // выполняем какие-либо действия }
Таким же образом вместо названия роли пользователя мы можем передать и название определённого права. Например проверим, что пользователь может переключать темы:
if( current_user_can( 'switch_themes' ) ) { // выполняем какие-либо действия }
И ещё кое-что, так как супер-администратор не является полноценной ролью, то его лучше проверять по-другому, функцией is_super_admin() или правом setup_network.
if( is_super_admin() ) { // или if( current_user_can( 'setup_network' ) ) { // в параметры также можем передать ID определённого пользователя }
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' ); // вешаем функцию на хук