Как применить класс к пользовательским пунктам меню на основе ролей пользователей


У меня на сайте есть раздел "Участники", и они видят определенные пользовательские пункты меню. Я ищу способ просто применить звездочку к <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(), но я, честно говоря, не уверен, как ее использовать в настоящее время.

Author: Community, 2011-07-19

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 */ }
 2
Author: Ryan Gibbons, 2011-07-20 05:05:00

Вместо добавления классов непосредственно в элементы 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*/}

Этот тип стиля является мощным в том смысле, что он действительно может уменьшить количество классов, требуемых в вашем коде.

 0
Author: robertwbradford, 2011-07-19 21:15:56

Попробуйте добавить global $current_user; get_currentuserinfo(); в начало вашей функции.

 0
Author: Pippin, 2011-07-19 21:16:48