Роли и возможности WordPress (а также некоторые твики для них)
Что представляют собой роли и возможности?
Эта подсистема WordPress отвечает за определение того, какие действия может совершать каждый пользователь веб-сайта. С ее помощью можно избавиться от беспорядка в консоли (авторы/участники не будете видеть многие пункты меню), а также повысить безопасность путем простого запрета на некоторые действия для определенных пользователей.
Система позволяет делать гораздо больше, чем просто скрывать пункты меню. Бывает так, что ссылка «Переместить в корзину» отсутствует в интерфейсе. Однако даже если пользователь посетит URL этой ссылки, он все равно не сможет удалить запись, поскольку его права доступа будут проверены перед тем, как выполнить действие. Это помогает предотвратить намеренный урон или случайные непродуманные действия.
Возможности
Возможности – это строительные блоки системы: они определяют действия, которые может совершать пользователь. К примеру, все администраторы имеют возможность publish_pages. Она позволяет им публиковать страницы. Остальные группы пользователей, такие как авторы или подписчики, не имеют этой возможности, т.е. они не могут публиковать страницы.
В WordPress имеется более 50 возможностей, связанных с разными компонентами: плагинами, записями, опциями, сетями мультисайтов и т.д. Мы рассмотрим их использование в данной статье.
Роли
Роли – простые возможности, объединенные в один пакет. То, что я раньше описывал как «другие группы пользователей, такие как авторы», можно просто назвать «другие роли».
WordPress по умолчанию имеет шесть ролей:
- Суперадминистратор
- Администратор
- Редактор
- Автор
- Участник
- Подписчик
Эти роли – наборы определенных возможностей. Подписчики имеют только возможность read, участники – только delete_posts и edit_posts, что позволяет им редактировать/создавать/удалять свои собственные записи.
Преимущества ролей и возможностей
Их очень много. Данная система составляет костяк управления пользователями в WordPress и прекрасно справляется с разбиением групп пользователей. С одной стороны, у нас есть преимущество эффективной работы с нашими пользователями.
С другой стороны, это позволяет нам лучше управлять контентом сайта. Убедитесь в том, что вы предлагаете как можно меньше прав доступа, однако столько, столько необходимо – это составляет базис тщательно отлаженной и защищенной системы. Редакторы не видят опции темы и плагинов, поскольку им это не требуется – авторы не могут удалять посты других людей, поскольку им это не требуется. Когда администратор видит чью-либо роль, он сразу понимает, что именно этот пользователь может делать, а что не может, что заметно упрощает работу в команде (и решение проблем).
Наконец, система возможностей обладает огромным преимуществом в плане безопасности, особенно при объединении с системой nonces, которая проверяет цели и права доступа. Всякий раз, когда вы выполняете какое-либо действие, WordPress проверяет ваши соответствующие возможности. Если вы используете nonces для проверки цели, и если проверка прошла успешно, действие выполняется. В противном случае вы получите сообщение об ошибке:
Давайте рассмотрим, почему nonces (одноразовые числа) являются необходимыми. Ссылка на удаление записи имеет следующий вид: http://wordpress.local/wp-admin/post.php?post=1&action=delete. Если вы посетите ссылку, войдя как администратор, запись будет удалена. Если WordPress не производит проверку ваших целей, это может стать проблемой. Я могу просто опубликовать ссылку на удаление контента – и если вы перейдете по ней, то контент будет удален. Именно здесь и пригождаются возможности, позволяющие убедиться в том, что ваших прав доступа достаточно для выполнения действия, однако нам нужны nonces также для проверки ваших целей. Если вы хотите узнать больше, прочтите статью про nonces.
Использование ролей и возможностей
При создании плагинов и тем вы можете ограничить определенные действия на базе ролей. К примеру, если вы создаете SEO-плагин, вы можете ограничить его использование авторами, редакторами и администраторами. Вы можете также сделать так, чтобы основные опции были доступны только для администраторов. Чтобы сделать это, используйте функцию current_user_can() или специфические параметры существующих функций WordPress. Давайте рассмотрим и то, и другое:
add_action( 'admin_menu', 'my_seo_plugin_menu_item' ); function my_seo_plugin_menu_item() { add_menu_page( 'My SEO Plugin Options', 'My SEO Plugin', 'manage_options', 'my-seo-plugin-general', 'my_seo_plugin_menu_page', 'dashicons-visibility', 6 ); }
В примере выше мы показали, как добавить дополнительный пункт верхнего уровня в меню администратора. Функция add_menu_page() имеет параметр для определения возможности, требуемой для просмотра пункта меню. В нашем случае это manage_options – по умолчанию она означает, что только администраторы могут видеть пункт меню.
Вы можете протестировать возможности самостоятельно, используя функции current_user_can() или user_can(). Давайте скроем ссылку удаления при помощи следующего метода:
<?php if( current_user_can( 'manage_options' ) ) : ?> <a href='#'>delete all SEO data</a> <?php endif ?>
Обратите внимание, что я использовал возможности в обоих случаях. Есть две причины, почему вы всегда должны использовать возможности. Одна из них связана с тем, как устроена функция проверки. В некоторых случаях, если вы зададите роль, она вернет true только для этой роли, а не для всех ролей выше нее. Смотрите тикет #22624 для получения большей информации.
Вторая причина имеет отношение к архитектуре ролей и возможностей. Роли – полностью произвольные имена, связанные с абсолютно произвольным списком возможностей. В действительности нет никаких гарантий того, что администратор будет иметь возможность manage_options. WordPress привязывает ее по умолчанию, однако с помощью кода или плагинов можно добавлять/удалять возможности из ролей или даже определенных пользователей. Именно по этой причине код, основанный на ролях, является нестабильным, поэтому всегда используйте возможности.
Создание произвольных ролей
При создании широкомасштабного приложения вам, возможно, понадобятся пользовательские роли, чтобы разбить пользователей по группам. Если вы выводите свои собственные объявления на сайте, вам, возможно, понадобится создать роль «компании» (company). Пользователи, относящиеся к этой роли, могут иметь отдельную возможность, которая позволит им просматривать страницу статистики для изучения эффективности объявлений.
Базовый код для реализации этого будет следующим: используем функцию add_role() для создания роли и добавляем возможности, которые нам нужны, в качестве третьего параметра функции. Первый параметр – это название роли, второй – это отображаемый заголовок.
add_role( 'company', 'Company', array( 'read' => true, 'level_0' => true, 'view_ad_stats' => true ) );
Поскольку функция add_role() либо создает роль, либо возвращает null, если роль уже существует, вы можете безопасно использовать ее в вашем коде. Отсюда следует, что нет никакой причины запускать эту функцию все время. Мне нравится подцеплять ее к хуку активации. Давайте рассмотрим более сложный пример:
function custom_role_company() { $author = get_role( 'author' ); $capabilities = $author->capabilities; $company = add_role( 'company', 'Company', $capabilities ); $company->add_cap( 'view_ad_stats' ); } register_activation_hook( __FILE__, 'custom_role_company' );
Здесь есть два отличия. Во-первых, я обернул код в функцию активации. Она выполняется только один раз, когда плагин активирован, и создает роль, если ее еще нет.
Во-вторых, чтобы не писать все возможности, которые мне требуются, я просто скопировал список возможностей роли автора и затем добавил мою уникальную роль для просмотра статистики рекламных объявлений. Чтобы получить роль автора, я использовал функцию get_role(), после чего вставил список возможностей в соответствующий параметр функции add_role().
Примечание по поводу пользовательских уровней
До того, как свет увидела версия WordPress 2.0 (что было очень давно), в WP использовалась система пользовательских уровней. В 2.0 ее заменила улучшенная система ролей и возможностей. Возможность level_x уходит своими корнями именно в старую систему.
Она не является обязательной, и я уверен, что лишь немногие системы используют ее сегодня. Если вы хотите гарантировать максимальную обратную совместимость, то в таком случае добавьте ее. Если вы не хотите добавлять пользовательские уровни, то в таком случае вам надо будет указать, что ваше решение совместимо только с версией 2.0 и выше.
Добавление произвольных возможностей
Предыдущие примеры уже показали, как добавить возможности к ролям. Мы можем просто передать список к функции add_role() или использовать метод add_cap() для объекта роли. Вы можете также добавить возможность к отдельному пользователю.
Чтобы сделать это, вам нужно будет использовать метод add_role() для объекта пользователя. Вот короткий пример того, как это реализовать:
$user = new WP_User( 23 ); $user->add_cap( 'view_ad_stats' );
Произвольные возможности очень полезны для управления пользователями на вашем сайте, особенно если вы работаете с интерактивными приложениями. Вы можете запустить сервер объявлений и иметь отдельные роли для покупателей рекламы, продавцов рекламы, менеджеров по работе с клиентами и т.д. Простая настройка того, кто и что может делать/просматривать, является очень полезной для разработчиков.
Плагины для управления ролями и возможностями
Role Scoper
Role scoper – плагин для дотошных менеджеров. Он дает тщательный контроль над каждым аспектом ваших ролей и возможностей. Смешивайте их и объединяйте, чтобы получить любую комбинацию из них и установить подходящие права доступа. Но не переборщите, ведь большое количество ролей и возможностей может в итоге перерасти в хаос.
Members
Members – плагин от Джастина Тэдлока, являющийся в целом фронтэндом для системы ролей и возможностей. Он позволяет вам создавать роли и привязывать к ним возможности, управляя всем этим через удобный пользовательский интерфейс.
Capability Manager Enhanced
Capability Manager Enhanced – еще один фронтэнд-интерфейс для модуля ролей и возможностей. Он не настолько популярный, как Members, однако имеет весомый показатель в 30,000+ активных установок. Он выполняет практически все, что должен делать плагин такого типа. Вы можете добавлять/редактировать/настраивать роли и возможности на вашем сайте.
Источник: wpmu.org