В WordPress стандартно предусмотрены несколько ролей пользователей, таких как Администратор, Редактор, Автор, Участник и Подписчик. Однако в ряде проектов возникает необходимость создавать собственные роли с уникальными правами доступа. Особенно это актуально для сайтов с нестандартной логикой работы с пользователями, где роли должны динамически меняться в зависимости от условий.
Почему нужны динамические роли пользователей в WordPress
Обычные статические роли не всегда подходят для сложных проектов. Например, если вы хотите, чтобы роль пользователя менялась в зависимости от активности, подписок, выполнения заданий или других критериев, нужно создавать динамическую систему ролей.
Динамические роли позволяют:
- Добавлять и убирать права доступа без необходимости глобального изменения ролей;
- Переключать роли автоматически, основываясь на поведении пользователя;
- Гибко управлять контентом и функционалом сайта для разных групп пользователей.
Рассмотрим, как создать и использовать такие роли на практике.
Создание собственной роли в WordPress с помощью кода
Для начала создадим простую пользовательскую роль с уникальными правами. Для этого используем функцию add_role(), но с префиксом wplancer_ для функций и ролей, чтобы не было конфликтов.
function wplancer_add_custom_role() {
add_role('wplancer_manager', 'Менеджер сайта', array(
'read' => true,
'edit_posts' => true,
'delete_posts' => false,
'publish_posts' => true,
'upload_files' => true,
'manage_categories' => true
));
}
add_action('init', 'wplancer_add_custom_role');Эта роль «Менеджер сайта» может читать, редактировать и публиковать записи, загружать файлы и управлять категориями, но не удалять записи.
Динамическое изменение ролей пользователей
Чтобы динамически менять роль пользователя, например, при достижении определённого уровня активности, используем хук wp_login или другие события. Ниже пример, который меняет роль пользователя на «Менеджер сайта», если он опубликовал более 10 записей.
function wplancer_update_user_role_on_post_count($user_login, $user) {
$user_id = $user->ID;
$args = array(
'author' => $user_id,
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1
);
$user_posts = get_posts($args);
if (count($user_posts) >= 10) {
$user->set_role('wplancer_manager');
}
}
add_action('wp_login', 'wplancer_update_user_role_on_post_count', 10, 2);<Таким образом, при каждой авторизации проверяется количество опубликованных пользователем записей и при достижении порога роль меняется.
Как откатить роль при снижении активности
Если нужна логика по возврату роли, например, если пользователь долго не публикует записи, можно добавить крон-задачу, которая будет регулярно проверять активность и менять роли обратно:
function wplancer_check_and_reset_user_roles() {
$users = get_users(array('role' => 'wplancer_manager'));
foreach ($users as $user) {
$args = array(
'author' => $user->ID,
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array('after' => '1 year ago'),
),
'posts_per_page' => 1
);
$recent_posts = get_posts($args);
if (empty($recent_posts)) {
$user->set_role('subscriber');
}
}
}
if (!wp_next_scheduled('wplancer_cron_check_roles')) {
wp_schedule_event(time(), 'daily', 'wplancer_cron_check_roles');
}
add_action('wplancer_cron_check_roles', 'wplancer_check_and_reset_user_roles');<Этот код ежедневно проверяет, есть ли у менеджеров свежие публикации, если нет — меняет роль обратно на «Подписчик».
Использование плагинов для управления ролями
Если не хочется писать код вручную, можно использовать плагины, которые поддерживают создание и динамическое управление ролями. Например:
- User Role Editor — позволяет создавать новые роли и гибко настраивать права. Подходит для начального этапа.
- Members — мощный плагин для управления ролями и правами, с возможностью добавлять условия через расширения.
- WP User Manager — позволяет создавать кастомные роли и менять их по событиям с помощью дополнительных настроек.
Однако при специфических задачах, как в нашем примере с динамическим изменением по количеству публикаций, лучше всё же использовать свой код.
Практические советы по работе с динамическими ролями
При создании динамических ролей стоит учитывать несколько моментов:
- Безопасность: Убедитесь, что новые роли не дают избыточных прав, которые могут навредить сайту.
- Производительность: При проверках активности пользователей используйте кеширование и ограничьте выборки, чтобы не замедлять работу сайта.
- Совместимость: Тестируйте роли с используемыми плагинами — некоторые могут некорректно работать с кастомными ролями.
Также полезно создавать вспомогательные функции с префиксом wplancer_, например:
function wplancer_get_user_post_count($user_id) {
$count = count(get_posts(array(
'author' => $user_id,
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1
)));
return $count;
}Это позволит переиспользовать код и сделать проект более поддерживаемым.
Интеграция с WPShop
Если вы используете темы или плагины от WPSHOP, например, Expert Review для отзывов или Quizle для квизов, динамические роли могут помочь управлять доступом к этим функциям. Например, выдавать роль «Менеджер сайта» только активным пользователям с определёнными правами на управление отзывами или квизами.