add_role() WP 2.0
Добавляет новую роль в WordPress.
Функция должна быть вызвана всего один раз. Потому что она изменяет данные в базе данных (таблица wp_options, поле wp_user_roles). Поэтому лучше изменять их во время активации/деактивации плагина или темы, см. пример.
Когда вызывать
Перед тем как добавлять или изменять роль, убедитесь что глобальная переменная $wp_roles
доступна. Лучше всего использовать хуки активации плагинов или тем, чтобы добавить новую роль. За хук активации плагина отвечает функция: register_activation_hook()
.
Удаление существующей роли
Если вы создаете новую роль и указываете ей возможности, то убедитесь, что такой роли не существует. add_role()
не будет работать если роль уже существует в базе данных.
Вариант решения такой проблемы, перед созданием роли её можно удалить, используя функцию remove_role(), в которой указать создаваемую вами роль.
wp_roles()
, WP_Roles()
Хуков нет.
Возвращает
Объект WP_Role, если удалось добавить роль и null, если не удалось.
Использование
add_role( $role, $display_name, $capabilities );
- $role(строка) (обязательный)
- Название роли: administrator, editor, author, contributor, subscriber.
По умолчанию: нет - $display_name(строка) (обязательный)
- Отображаемое имя для роли: Администратора, Автор, Подписчик и т.д.
По умолчанию: нет - $capabilities(массив)
- Массив с возможностями новой роли. Возможности по умолчанию смотрите тут.
По умолчанию:array()
Примеры
#1. Создадим новую роль
Роль будет называться basic_contributor, а отображаться будет как "Основной участник".
Важно. Код должен быть запущен только один раз! Не оставляйте его работать постоянно!
$result = add_role( 'basic_contributor', 'Основной участник', array( 'read' => true, // true разрешает эту возможность 'edit_posts' => true, // true разрешает редактировать посты 'upload_files' => true, // может загружать файлы ) ); if ( null !== $result ) { echo 'Ура! Новая роль создана!'; } else { echo 'Ой... Такая роль уже существует.'; }
#2 Создание новой роли при активации плагина
register_activation_hook( __FILE__, 'add_roles_on_plugin_activation' ); function add_roles_on_plugin_activation() { add_role('custom_role', 'Custom Subscriber', array( 'read' => true, 'level_0' => true ) ); }
#3 Создание новой роли при активации темы и удаление роли при деактивации темы
// Удаляем роль при деактивации нашей темы add_action( 'switch_theme', 'deactivate_my_theme' ); function deactivate_my_theme() { remove_role( 'basic_contributor' ); } // Добавляем роль при активации нашей темы add_action( 'after_switch_theme', 'activate_my_theme' ); function activate_my_theme() { add_role( 'basic_contributor', 'Основной участник', [ 'read' => true, // true разрешает эту возможность 'edit_posts' => true, // true разрешает редактировать посты 'upload_files' => true, // может загружать файлы ] ); }
Подробности читайте в описании к хукам switch_theme и after_switch_theme.
#4 Наследуем права и возможности роли "Автор"
// Получим объект данных роли "Автор" $author = get_role( 'author' ); // Создадим новую роль и наделим её правами "Автора" add_role( 'project_manager', 'Руководитель проекта', $author->capabilities );
А можно ко 2 примеру дописать условие проверки? А то боюсь ошибиться здесь. К примеру,если этот пользователь относится к этой роли - запретить/разрешить что-либо.
И ещё вопросик: где в базе находятся записи о той или иной роли?
Не понял, во втором примере ведь просто создается дополнительная роль. Причем тут пользователь?
Создал роль, добавил эту роль какому-то пользователю. Дальше проверяешь эту роль у юзера, через current_user_can('роль'). Но current_user_can для роли почему-то не рекомендуется. Поэтому можешь использовать функцию
is_user_role( $role )
из заметок в описании: current_user_can()Опция wp_user_roles в таблице опций, где wp_ префикс БД.
Не причем, я просто интересовался, как сделать желаемое. За справку спасибо, на все вопросы получил ответы!
В профиле юзера нет данной роли:
что не так?
Куда Вы это прописали и что сделали?
В основной файл плагина. пробовал деактивировать и активировать плагин, но роль не появляется в списках выбора.
Подскажите, а как для определённой роли запретить создание/редактирование постов типа запись и страница, но разрешить создание/редактирование постов произвольного типа?
Правда, это надо было в add_cap() спрашивать, но не вижу, как удалить комментарий..
Никак не могу понять, почему не подхватывает перевод.
add_role('site_manager', __('Manager', 'site')...
Возможно, из-за того, что файлы локализации загружаются позже. Не понятно тогда, ведь, как я понимаю если add_role происходит в момент активации плагина, то как запустить файлы локализации раньше этого события?