Как применить класс к пользовательским пунктам меню на основе ролей пользователей
У меня на сайте есть раздел "Участники", и они видят определенные пользовательские пункты меню. Я ищу способ просто применить звездочку к <li>
на основе ее уровня разрешений и роли пользователя.
Что-то в этом роде.
if( current_user_can('integrator') || current_user_can('distributor')) :
Это то, что у меня есть до сих пор, и оно применяет класс к каждому пункту меню, если роль пользователя (какая угодно). Мне, по сути, нужно применить класс, если присутствует другой класс и роль пользователя (неважно)...
add_filter('nav_menu_css_class' , 'my_nav_special_class' , 10 , 2);
function my_nav_special_class($classes, $item){
if (current_user_can('integrator') || current_user_can('distributor')){
$classes[] = 'PARTNER_STAR';
}
return $classes;
}
Любезно предоставлено Bainternet из этого поста
Любые идеи будут оценены по достоинству
Обновление: Я также хочу отметить, что я использую " Область действия ролей" для обработки разрешений. У них есть функция шаблона is_restricted_rs()
, но я, честно говоря, не уверен, как ее использовать в настоящее время.
3 answers
Ответьте на ваш вопрос "необходимо применить класс, если присутствует другой класс и роль пользователя (какая угодно)"
Проще всего было сделать это, не в коде, но все же в CSS. Вы можете настроить таргетинг на элемент, который имеет более одного класса. Итак, используя свой класс PARTNER_STAR
, и если ваш другой класс, скажем, another
, вы можете создать свой css таким образом, чтобы
.another { /* targets all elements with another set */ }
.PARTNER_STAR { /* targets all elements with PARTNER_STAR set */ }
.another.PARTNER_STAR { /* targets elements that have BOTH PARTNER_STAR and another set */ }
Связывая идею @robertwbradford, вы можете просто установить один родительский элемент, и он не нужен для каждого из них. Если у вас есть несколько ролей, которым нужен только один стиль, у вас все еще может быть свой оператор if, просто примените css к родительскому элементу высокого уровня.
.PARTNER_STAR .another { /* targets all elements with another inside PARTNER_STAR */ }
Вместо добавления классов непосредственно в элементы li, вы можете добавить их в оболочку. Или почему бы не использовать тег body, чтобы он был доступен для нескольких элементов? Что-то вроде:
# functions.php
function user_role_class() {
// Some code here to return a string containing the user's role(s).
// Perhaps see http://codex.wordpress.org/Function_Reference/get_role as a start?
}
# header.php
...
<body <?php body_class(user_role_class()); ?>>
...
Затем в вашей таблице стилей что-то вроде этого:
# style.css
ul.menu{/*default menu formatting here*/}
body.integrator ul.menu{/*role-specific menu formatting here*/}
Этот тип стиля является мощным в том смысле, что он действительно может уменьшить количество классов, требуемых в вашем коде.
Попробуйте добавить global $current_user; get_currentuserinfo();
в начало вашей функции.