Si el usuario actual es administrador o editor

101

¿Cómo puedo verificar si el usuario que inició sesión actualmente es un administrador o un editor?

Sé cómo hacer cada uno individualmente:

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

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

¿Pero cómo los trabajo juntos? Es decir, ¿el usuario es administrador o editor?

andy
fuente
10
if( current_user_can('editor') || current_user_can('administrator') )
Shazzad

Respuestas:

190

Primera respuesta, no relacionada con WordPress porque es solo PHP: use el operador lógico "O":

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

Si desea verificar más de dos roles, puede verificar si los roles del usuario actual están dentro de una matriz de roles, algo así como:

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

Sin embargo, current_user_canpuede usarse no solo con el nombre del rol de los usuarios, sino también con las capacidades.

Entonces, una vez que tanto los editores como los administradores pueden editar páginas, su vida puede ser más fácil al verificar esas capacidades:

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

Eche un vistazo aquí para obtener más información sobre las capacidades.

gmazzap
fuente
1
¿necesitas comprobar si is_logged_in();?
RobBenz
3
@RobBenz no, en cualquiera de los casos. Porque current_user_can()siempre devuelve falso si el usuario no ha iniciado sesión, y wp_get_current_user()devolverá un usuario sin ningún rol si el usuario no ha iniciado sesión, por lo array_intersect()que siempre será falso.
gmazzap
1
En el PHPDoc de la current_user_can()función, podemos ver la línea " Si bien, en parte, se admite la verificación de roles particulares en lugar de una capacidad, esta práctica se desaconseja, ya que puede producir resultados poco confiables ". Así que creo que sería mejor evitar usar roles mientras se verifica la capacidad de un usuario :-)
Erenor Paz
Cuando uso el array_intersectmétodo, recibo una advertencia de PHP en nuestro registro de errores del servidor que dice array_intersect(): Argument #2 is not an array. ¿Esto se debe a que los usuarios que está comprobando solo tienen un Rol?
Garconis
@Garconis normalmente debería ser una matriz. Por alguna razón, parece que no es una matriz. array_intersect($allowed_roles, (array)$user->roles )funcionará sin problemas.
gmazzap
9

Primero, current_user_can()no debe usarse para verificar el rol de un usuario; debe usarse para verificar si un usuario tiene una capacidad específica .

En segundo lugar, en lugar de preocuparse por la función del usuario, sino centrarse en las capacidades, no tiene que preocuparse por hacer cosas como el problema planteado en la pregunta original (que es verificar si el usuario es un administrador O un editor). En cambio, si current_user_can()se usara según lo previsto, que es verificar las capacidades de un usuario, no su función, no necesitaría la verificación condicional para contener una prueba "o" (||). Por ejemplo:

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

edit_pages es una capacidad de los roles de administrador y editor, pero no de roles inferiores, como los autores. Así es como current_user_can()se pretendía utilizar.

butlerblog
fuente
Tenga en cuenta : los desarrolladores de WP de alto nivel están de acuerdo con esta respuesta. Debe intentar evitar la verificación de roles tanto como sea posible, use capacidades. Actualmente estoy trabajando en un proyecto con múltiples roles que solo tienen el límite de 'lectura'. La única solución es la verificación de roles para mí. Lo siento, no puedo encontrar el enlace, fue una discusión abierta sobre WP Github.
Bjorn
Esta debería ser la respuesta aceptada, OMI. current_user_cangeneralmente debe usarse para capacidades, no roles.
Armstrongest
2

Como dijo la respuesta @butlerblog, no debe usar current_user_can para verificar un rol

Este aviso se agrega específicamente en la documentación de PHP de la has_capfunción a la que llamacurrent_user_can

Si bien la verificación de un rol en lugar de una capacidad se admite en parte, esta práctica se desaconseja, ya que puede producir resultados poco confiables.

La forma CORRECTA de hacer esto es obtener el usuario y verificar $user->roles, de esta manera:

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

Aquí hay algunas funciones auxiliares que uso para hacer esto (ya que a veces no quiero solo el usuario actual):

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

Entonces puedes hacer esto:

current_user_has_role( 'editor' );

o

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

sMyles
fuente
-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
fuente
1
Sería genial si pudieras explicar cómo ayuda OP.
bravokeyl
Puede permitir ver solo la página "editor" o "miembro", puede publicar este código directamente en generic-page.php
seowmx
44
Por favor, no solo suelte el código. Agregue comentarios y alguna explicación de cómo esto resuelve el problema de los solicitantes.
kraftner