Wenn der aktuelle Benutzer ein Administrator oder ein Editor ist

101

Wie kann ich überprüfen, ob der aktuell angemeldete Benutzer ein Administrator oder ein Editor ist?

Ich weiß, wie man jedes für sich macht:

<?php if(current_user_can('editor')) { ?> 
    <!-- Stuff here for editors -->
<?php } ?>

<?php if(current_user_can('administrator')) { ?>
    <!-- Stuff here for administrators -->
<?php } ?>

Aber wie arbeite ich diese zusammen? Dh der Benutzer ist Administrator oder Redakteur?

Andy
quelle
10
if( current_user_can('editor') || current_user_can('administrator') )
Shazzad

Antworten:

190

Erste Antwort, nicht auf WordPress bezogen, da es sich nur um PHP handelt: Verwenden Sie den logischen "OR" -Operator:

<?php if( current_user_can('editor') || current_user_can('administrator') ) {  ?>
    // Stuff here for administrators or editors
<?php } ?>

Wenn Sie mehr als zwei Rollen prüfen möchten, können Sie prüfen, ob die Rollen des aktuellen Benutzers in einem Array von Rollen enthalten sind, wie z.

$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator', 'author');
<?php if( array_intersect($allowed_roles, $user->roles ) ) {  ?>
   // Stuff here for allowed roles
<?php } ?>

Allerdings current_user_cankann verwendet werden , nicht nur mit Benutzerrollennamen, sondern auch mit Fähigkeiten.

Sobald also sowohl Redakteure als auch Administratoren Seiten bearbeiten können, kann es für Sie einfacher sein, nach diesen Funktionen zu suchen:

<?php if( current_user_can('edit_others_pages') ) {  ?>
    // Stuff here for user roles that can edit pages: editors and administrators
<?php } ?>

Werfen Sie einen Blick hier für weitere Informationen über Fähigkeiten.

gmazzap
quelle
1
Müssen Sie überprüfen, ob is_logged_in();?
RobBenz
3
@RobBenz nein, in keinem Fall. Weil current_user_can()immer false zurückgibt, wenn der Benutzer nicht angemeldet ist, und wp_get_current_user()einen Benutzer ohne Rolle zurückgibt, wenn der Benutzer nicht angemeldet ist, ist der array_intersect()immer false.
gmazzap
1
Im PHPDoc der current_user_can()Funktion sehen wir die Zeile " Obwohl das Prüfen auf bestimmte Rollen anstelle einer Funktion teilweise unterstützt wird, wird von dieser Vorgehensweise abgeraten, da dies zu unzuverlässigen Ergebnissen führen kann ". Ich denke, es wäre besser, Rollen zu vermeiden, während man nach den Fähigkeiten eines Benutzers
sucht
Wenn ich die array_intersectMethode verwende, wird eine PHP-Warnung in unserem Server-Fehlerprotokoll angezeigt array_intersect(): Argument #2 is not an array. Liegt das daran, dass die Benutzer, die überprüft werden, nur eine Rolle haben?
Garconis
@Garconis sollte normalerweise ein Array sein. Aus irgendeinem Grund scheint es für Sie kein Array zu sein. array_intersect($allowed_roles, (array)$user->roles )wird ohne Probleme funktionieren.
gmazzap
9

Erstens current_user_can()sollte nicht verwendet werden, um die Rolle eines Benutzers zu überprüfen - es sollte verwendet werden, um zu überprüfen, ob ein Benutzer eine bestimmte Fähigkeit hat .

Zweitens müssen Sie sich nicht mit der Rolle des Benutzers befassen, sondern sich auf die Funktionen konzentrieren. Sie müssen sich nicht mit Dingen wie dem in der ursprünglichen Frage gestellten Problem befassen (bei dem überprüft wird, ob der Benutzer ein Administrator ODER ein Editor ist). Wenn Sie stattdessen current_user_can()wie beabsichtigt verwenden, um die Funktionen eines Benutzers und nicht seine Rolle zu überprüfen, benötigen Sie die bedingte Prüfung nicht, um einen "oder" -Test (||) zu enthalten. Zum Beispiel:

if ( current_user_can( 'edit_pages' ) ) { ...

edit_pages ist eine Funktion sowohl für Administrator- als auch für Editorrollen, jedoch nicht für untergeordnete Rollen wie Autoren. So current_user_can()sollte es benutzt werden.

Butlerblog
quelle
Bitte beachten Sie : Hochrangige WP-Entwickler stimmen dieser Antwort zu. Sie sollten versuchen, Rollenüberprüfungen so weit wie möglich zu vermeiden. Verwenden Sie Capabilties. Ich arbeite derzeit an einem Projekt mit mehreren Rollen, die nur die Obergrenze für Lesen haben. Die einzige Lösung ist für mich die Rollenüberprüfung. Entschuldigung, ich kann den Link nicht finden, es war eine offene Diskussion über den WP Github.
Bjorn
Dies sollte die akzeptierte Antwort sein, IMO. current_user_cansollte im Allgemeinen für Funktionen verwendet werden, nicht für Rollen.
Armstrongest
2

Wie in der Antwort von @butlerblog angegeben, sollten Sie current_user_can nicht zum Überprüfen einer Rolle verwenden

Dieser Hinweis wurde speziell in die PHP-Dokumentation der has_capFunktion aufgenommen, die von aufgerufen wirdcurrent_user_can

Die Überprüfung anhand einer Rolle anstelle einer Funktion wird teilweise unterstützt. Von dieser Vorgehensweise wird jedoch abgeraten, da sie möglicherweise zu unzuverlässigen Ergebnissen führt.

Die RICHTIGE Möglichkeit, dies zu tun, besteht darin, den Benutzer zu holen und das zu überprüfen $user->roles, wie folgt :

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ) {

        $user = get_userdata( get_current_user_id() );
        if( ! $user || ! $user->roles ){
            return false;
        }

        if( is_array( $role ) ){
            return array_intersect( $role, (array) $user->roles ) ? true : false;
        }

        return in_array( $role, (array) $user->roles );
    }
}

Hier sind einige Hilfsfunktionen, die ich dazu benutze (da ich manchmal nicht nur den aktuellen Benutzer haben möchte):

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ){
        return user_has_role_by_user_id( get_current_user_id(), $role );
    }
}

if( ! function_exists( 'get_user_roles_by_user_id' ) ){
    function get_user_roles_by_user_id( $user_id ) {
        $user = get_userdata( $user_id );
        return empty( $user ) ? array() : $user->roles;
    }
}

if( ! function_exists( 'user_has_role_by_user_id' ) ){
    function user_has_role_by_user_id( $user_id, $role ) {

        $user_roles = get_user_roles_by_user_id( $user_id );

        if( is_array( $role ) ){
            return array_intersect( $role, $user_roles ) ? true : false;
        }

        return in_array( $role, $user_roles );
    }
}

Dann können Sie dies einfach tun:

current_user_has_role( 'editor' );

oder

current_user_has_role( array( 'editor', 'administrator' ) );

sMyles
quelle
-1
<?php if( current_user_can('editor')) :
  echo "welcome";
elseif( current_user_can('member')) :
  echo "welcome";
else :
 wp_die("<h2>To view this page you must first <a href='". wp_login_url(get_permalink()) ."' title='Login'>log in</a></h2>");
endif;
?>
seowmx
quelle
1
Es wäre toll, wenn Sie erklären könnten, wie es OP hilft.
Bravokeyl
Du kannst zulassen, dass nur die Seite "editor" oder "member" angezeigt wird. Du kannst diesen Code direkt in generic-page.php
seowmx
4
Bitte nicht einfach den Code fallen lassen. Fügen Sie Kommentare und Erklärungen hinzu, um das Problem der Fragesteller zu lösen.
Kraftner