Si l'utilisateur actuel est un administrateur ou un éditeur

104

Comment puis-je vérifier si l'utilisateur actuellement connecté est un administrateur ou un éditeur?

Je sais faire chacun individuellement:

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

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

Mais comment puis-je les travailler ensemble? C'est-à-dire que l'utilisateur est un administrateur ou un éditeur?

Andy
la source
10
if( current_user_can('editor') || current_user_can('administrator') )
Shazzad

Réponses:

193

Première réponse, pas liée à WordPress car il ne s'agit que de PHP: Utilisez l'opérateur logique "OU":

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

Si vous souhaitez vérifier plus de deux rôles, vous pouvez vérifier si les rôles de l'utilisateur actuel se trouvent dans un tableau de rôles, comme par exemple:

$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 } ?>

Toutefois, ils current_user_canpeuvent être utilisés non seulement avec le nom de rôle des utilisateurs, mais également avec des fonctionnalités.

Ainsi, une fois que les éditeurs et les administrateurs peuvent modifier des pages, votre vie peut être plus facile à vérifier pour ces fonctionnalités:

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

Regardez ici pour plus d'informations sur les capacités.

gmazzap
la source
1
avez-vous besoin de vérifier si is_logged_in();?
RobBenz
3
@RobBenz Non, dans aucun des cas. Parce que current_user_can()renvoie toujours false si l'utilisateur n'est pas connecté, et wp_get_current_user()retournera un utilisateur sans aucun rôle si l'utilisateur n'est pas connecté, donc ce array_intersect()sera toujours false.
gmazzap
1
Dans le PHPDoc de la current_user_can()fonction, nous pouvons voir la ligne " Bien que la vérification par rapport à des rôles particuliers au lieu d'une capacité soit partiellement prise en charge, cette pratique est déconseillée car elle peut produire des résultats non fiables ". Donc, je pense qu'il serait préférable d'éviter d'utiliser des rôles tout en vérifiant la capacité d'un utilisateur :-)
Erenor Paz
Lorsque j'utilise cette array_intersectméthode, un avertissement PHP s'affiche dans le journal des erreurs de notre serveur array_intersect(): Argument #2 is not an array. Est-ce parce que les utilisateurs qu'il vérifie n'ont qu'un seul rôle?
Garconis
@Garconis devrait normalement être un tableau. Pour une raison quelconque, il semble que pour vous ne soit pas un tableau. array_intersect($allowed_roles, (array)$user->roles )fonctionnera sans problèmes.
gmazzap
9

Tout d'abord, current_user_can()ne doit pas être utilisé pour vérifier le rôle d'un utilisateur, mais plutôt pour vérifier si un utilisateur dispose d'une capacité spécifique .

Deuxièmement, plutôt que de vous préoccuper du rôle de l'utilisateur mais de vous concentrer sur les capacités, vous n'avez pas à vous préoccuper du problème évoqué dans la question initiale (qui consiste à vérifier si l'utilisateur est un administrateur OU un éditeur). Au lieu de cela, si current_user_can()était utilisé comme prévu, c'est-à-dire pour vérifier les capacités d'un utilisateur, et non son rôle, vous n'auriez pas besoin de la vérification conditionnelle pour contenir un test "ou" (||). Par exemple:

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

edit_pages est une fonctionnalité des rôles d'administrateur et d'éditeur, mais pas de rôles inférieurs tels que des auteurs. Voici comment current_user_can()était destiné à être utilisé.

butlerblog
la source
Remarque : les développeurs WP de haut niveau sont d'accord avec cette réponse. Vous devriez essayer d'éviter autant que possible la vérification des rôles, utilisez des capacités. Je travaille actuellement sur un projet avec plusieurs rôles qui n'ont que le cap 'en lecture'. La seule solution est la vérification des rôles pour moi. Désolé, je ne trouve pas le lien, il s’agissait d’une discussion ouverte sur le WP Github.
Bjorn le
Cela devrait être la réponse acceptée, IMO. current_user_candevrait généralement être utilisé pour des capacités, pas des rôles.
Armstrongest
2

Comme @butlerblog Reply a déclaré, vous ne devriez pas utiliser current_user_can pour vérifier un rôle

Cet avis est spécifiquement ajouté dans la documentation PHP de la has_capfonction appelée parcurrent_user_can

Bien que la prise en charge d'un rôle au lieu d'une capacité soit partiellement prise en charge, cette pratique est déconseillée car elle peut produire des résultats peu fiables.

La bonne façon de faire est d’obtenir l’utilisateur et de vérifier $user->roles, comme ceci:

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

Voici quelques fonctions d'aide que j'utilise pour faire ceci (comme parfois je ne veux pas que l'utilisateur actuel):

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

Ensuite, vous pouvez simplement faire ceci:

current_user_has_role( 'editor' );

ou

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

sMyles
la source
-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
la source
1
Ce serait formidable si vous pouviez expliquer comment cela aide OP.
bravokeyl
Vous pouvez autoriser voir la page uniquement "éditeur" ou "membre", vous pouvez poster ce code directement en generic-page.php
seowmx le
5
S'il vous plaît ne laissez pas tomber le code. Ajoutez des commentaires et des explications sur la manière dont cela résout le problème des demandeurs.
kraftner
Donc, votre réponse est la duplication de code pour chaque rôle?
Julix il y a