it-swarm.com.de

Wie wende ich eine Klasse auf benutzerdefinierte Menüelemente an, die auf Benutzerrollen basieren?

Ich habe einen Mitgliederbereich auf meiner Website, in dem bestimmte benutzerdefinierte Menüelemente angezeigt werden. Ich suche nach einer Möglichkeit, einfach einen Stern auf den <li> anzuwenden, basierend auf seiner Berechtigungsstufe und der Rolle des Benutzers.

Etwas zum Effekt von.

if( current_user_can('integrator') || current_user_can('distributor')) :

Dies ist, was ich bisher habe, und es wendet eine Klasse auf jeden Menüpunkt an, wenn die Rolle des Benutzers (was auch immer) ist. Ich muss die Klasse im Wesentlichen anwenden, wenn eine andere Klasse vorhanden ist und die Rolle des Benutzers (was auch immer) ist ...

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;
}

Mit freundlicher Genehmigung Bainternet von diesem Beitrag

Irgendwelche Ideen würden geschätzt

Update: Ich möchte auch beachten, dass ich " Role Scoper " verwende, um mit Berechtigungen umzugehen. Sie haben eine Template-Funktion is_restricted_rs(), aber ich bin mir ehrlich nicht sicher, wie ich sie momentan verwenden soll.

1

WRT auf Ihre Frage "müssen die Klasse anwenden, wenn eine andere Klasse vorhanden ist und die Rolle des Benutzers (was auch immer) ist"

Am einfachsten war das, nicht im Code, aber doch im CSS. Sie können ein Element mit mehr als einer Klasse als Ziel festlegen. Verwenden Sie also Ihre Klasse PARTNER_STAR und wenn Ihre andere Klasse another lautet, können Sie Ihre CSS so einrichten, dass

.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 */ }

In Anlehnung an @robertwbradford können Sie nur ein übergeordnetes Element festlegen, das Sie nicht für jedes einzelne benötigen. Wenn Sie mehrere Rollen haben, für die nur ein Stil erforderlich ist, können Sie Ihre if-Anweisung weiterhin verwenden. Wenden Sie das CSS einfach auf ein übergeordnetes Element auf hoher Ebene an.

.PARTNER_STAR .another { /* targets all elements with another inside PARTNER_STAR */ }
2
Ryan Gibbons

Anstatt die Klassen direkt zu den li-Elementen hinzuzufügen, können Sie sie einem Wrapper hinzufügen. Oder warum nicht das Body-Tag, damit es für mehrere Elemente verfügbar ist? So etwas wie:

# 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()); ?>>
...

Dann in Ihrem Stylesheet so etwas wie:

# style.css
ul.menu{/*default menu formatting here*/}
body.integrator ul.menu{/*role-specific menu formatting here*/}

Diese Art der Formatierung ist insofern leistungsstark, als sie die Anzahl der in Ihrem Code erforderlichen Klassen erheblich reduzieren kann.

0
robertwbradford

Versuchen Sie, global $current_user; get_currentuserinfo(); an die Spitze Ihrer Funktion zu setzen.

0
Pippin