Si el usuario actual es un administrador o editor

30 ene 2014, 16:08:32
Vistas: 429K
Votos: 167

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

Sé cómo hacerlo individualmente:

<?php if(current_user_can('editor')) { ?> 
    <!-- Contenido aquí para editores -->
<?php } ?>

<?php if(current_user_can('administrator')) { ?>
    <!-- Contenido aquí para administradores -->
<?php } ?>

Pero ¿cómo puedo combinarlos juntos? Es decir, ¿que el usuario sea un administrador o editor?

1
Comentarios

if( current_user_can('editor') || current_user_can('administrator') )

Shazzad Shazzad
30 ene 2014 16:10:02
Todas las respuestas a la pregunta 6
7
318

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

<?php if( current_user_can('editor') || current_user_can('administrator') ) {  ?>
    // Contenido aquí para administradores o editores
<?php } ?>

Si deseas verificar más de dos roles, puedes comprobar si los roles del usuario actual están dentro de un array de roles, algo como:

$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator', 'author');
<?php if( array_intersect($allowed_roles, $user->roles ) ) {  ?>
   // Contenido aquí para roles permitidos
<?php } ?>

Sin embargo, current_user_can se puede usar no solo con nombres de roles de usuarios, sino también con capacidades.

Así que, dado que tanto los editores como los administradores pueden editar páginas, tu vida puede ser más fácil verificando esas capacidades:

<?php if( current_user_can('edit_others_pages') ) {  ?>
    // Contenido aquí para roles de usuario que pueden editar páginas: editores y administradores
<?php } ?>

Mira aquí para más información sobre capacidades.

30 ene 2014 16:16:14
Comentarios

¿necesitas comprobar si is_logged_in();?

RobBenz RobBenz
1 may 2017 14:09:58

@RobBenz no, en ninguno de los casos. Porque current_user_can() siempre devuelve false si el usuario no está conectado, y wp_get_current_user() devolverá un usuario sin ningún rol si el usuario no está conectado, por lo que el array_intersect() siempre será false.

gmazzap gmazzap
1 may 2017 21:46:24

En el PHPDoc de la función current_user_can(), podemos ver la línea "Si bien la comprobación de roles particulares en lugar de una capacidad está parcialmente soportada, esta práctica no se recomienda ya que puede producir resultados poco fiables". Así que creo que sería mejor evitar usar roles al comprobar la capacidad de un usuario :-)

Erenor Paz Erenor Paz
1 sept 2017 12:58:24

Cuando uso el método array_intersect, obtengo una advertencia de PHP en el registro de errores de nuestro servidor que dice array_intersect(): Argument #2 is not an array. ¿Es esto porque el/los usuario(s) que está verificando solo tiene(n) un Rol?

Garconis Garconis
23 ene 2018 16:44:54

@Garconis normalmente debería ser un array. Por alguna razón parece que para ti no es un array. array_intersect($allowed_roles, (array)$user->roles ) funcionará sin problemas.

gmazzap gmazzap
25 ene 2018 09:02:14

Recomendaría no verificar contra roles... sino contra capacidades. Es más fácil eliminar o agregar una capacidad a un conjunto de roles... es más explícito. Por ejemplo current_user_can('edit_orderform')... tal vez un Representante de Ventas SOLO debería poder editar el formulario de pedido... pero no tener los derechos para agregar contenido. Otorgar explícitamente esa capacidad es una estructura de permisos más explícita que el rol que tiene un usuario. Las personas desempeñan múltiples funciones en organizaciones más grandes. Puedes tener suscriptores que tengan más acceso que solo lectura.

Armstrongest Armstrongest
14 may 2019 00:42:05

+1 no estoy seguro de por qué la gente está enfurecida contra el uso de current_user_can para verificar roles. Está documentado en la API como un uso legítimo, fin de la historia. ¿Es inteligente hacerlo? depende del contexto

Mark Kaplun Mark Kaplun
27 sept 2021 08:21:03
Mostrar los 2 comentarios restantes
11
21

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.

Segundo, en lugar de preocuparse por el rol del usuario y enfocándose en las capacidades, no tienes que molestarte en hacer cosas como el problema mencionado en la pregunta original (que es verificar si el usuario es un administrador O un editor). En su lugar, si current_user_can() se usara como está previsto, que es verificar las capacidades de un usuario, no su rol, no necesitarías que la verificación condicional contenga una prueba "or" (||). Por ejemplo:

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

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

6 ene 2019 05:23:19
Comentarios

Tenga en cuenta: Los desarrolladores WP de alto nivel están de acuerdo con esta respuesta. Debe tratar de 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 la capacidad 'read'. La única solución para mí es la verificación de roles. Lo siento, no puedo encontrar el enlace, era una discusión abierta en el Github de WP.

Bjorn Bjorn
27 abr 2019 00:44:38

Esta debería ser la respuesta aceptada, en mi opinión. current_user_can generalmente debería usarse para capacidades, no para roles.

Armstrongest Armstrongest
14 may 2019 00:43:30

+1 a esto, evite verificar roles mediante current_user_can(). Si desea verificar roles por clave, entonces realice una verificación de rol en lugar de una verificación de capacidad :)

William Patton William Patton
5 mar 2020 13:43:13

¿Cuál es entonces la función correcta para verificar los roles de usuario de manera explícita y segura? Parece que es un poco difícil encontrarla (si existe). @Bjorn

Viktor Borítás Viktor Borítás
15 abr 2020 11:26:55

@Viktor Borítás Hay múltiples soluciones válidas en esta página. Pero úsalas solo si current_user_can() no es una opción. Además, mi comentario está más orientado a la seguridad. Por ejemplo, si quieres restringir contenido para usuarios específicos, en la mayoría de los casos una verificación de capacidades es suficiente para esta tarea.

Bjorn Bjorn
16 abr 2020 16:21:43

Es preferible usar capacidades "para proteger" operaciones porque son más flexibles, más fáciles de filtrar y asignar granularmente a los usuarios. Pero si la pregunta que se busca responder es "¿Es el usuario actual un editor?" entonces usar current_user_can está perfectamente bien, de hecho, esa es exactamente la forma en que se debe usar.

gmazzap gmazzap
18 mar 2021 20:55:11

@gmazzap - en realidad, usar current_user_can() para verificar un rol no es "perfectamente correcto". Si lo fuera, ¿por qué la documentación de la función necesitaría decir "esta práctica está desaconsejada ya que puede producir resultados poco fiables"? El hecho de que algo "funcione" no lo convierte en una buena práctica o una práctica aceptable. Internet ya está lleno de malas prácticas de programación presentadas como aceptables. Por favor, no contribuyas a ello.

butlerblog butlerblog
13 abr 2021 20:16:12

@butlerblog ¿sabes que el Codex está escrito por colaboradores? Llevo 16 años programando para WordPress, y con la cantidad de errores que he encontrado en el Codex durante estos años podría escribir un libro. Dicho esto, esto no es un error sino que está mal redactado. Como ya escribí, la práctica está desaconsejada para responder a la pregunta: "¿tiene permitido el usuario actual hacer X?" porque si eso es lo que necesitas responder, verificar el rol producirá resultados poco fiables. Pero si quieres responder a la pregunta "¿Tiene este usuario el rol X?", que es una pregunta diferente, entonces current_user_can() es la forma correcta de hacerlo.

gmazzap gmazzap
16 abr 2021 15:33:46

No me estoy refiriendo al codex. No solo el codex está técnicamente obsoleto, sino que de lo que estamos hablando viene directamente de la documentación en línea del Core, y está en la documentación para desarrolladores, que tiene considerablemente más supervisión que el codex. Además, fomentar que esta función se use de esa manera lleva a otros malos hábitos en el uso inadecuado de roles vs capacidades, ejemplos de los cuales abundan por toda la red. Eres libre de tener tu opinión, pero tendremos que acordar estar en desacuerdo.

butlerblog butlerblog
17 abr 2021 20:38:22

Lo siento, si esto está técnicamente obsoleto, ¿cuál es la forma que usas en WordPress para verificar si un usuario tiene un rol? @butlerblog Ten en cuenta que no estoy preguntando cuál es la forma de verificar si un usuario está autorizado para realizar una operación, sino - de nuevo - para verificar si un usuario tiene un rol o no.

gmazzap gmazzap
31 oct 2022 11:34:56

Cuando dije "técnicamente obsoleto", me refería específicamente a tu referencia al codex. Usar current_user_can() no está obsoleto - nunca se suponía que debía usarse para verificar un rol - ha sido así desde WP 2.0, y está anotado en línea y en la documentación para desarrolladores. Para verificar si un usuario tiene un rol (lo cual casi nunca hay una buena razón para hacer), es un array en el objeto: $user->roles. Por ejemplo: in_array( 'some_role', $user->roles ); Pero verificar roles lleva a malos hábitos. Los roles están destinados a asignar en masa un grupo de capacidades a un usuario, es la capacidad lo que debe verificarse.

butlerblog butlerblog
2 nov 2022 17:42:47
Mostrar los 6 comentarios restantes
5

Como respondió @butlerblog, no deberías usar current_user_can para verificar contra un rol

Este aviso se agregó específicamente en la documentación PHP de la función has_cap que es llamada por current_user_can

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

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

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

        $user = get_userdata( get_current_user_id() );
        // Si no hay usuario o roles, retornar falso
        if( ! $user || ! $user->roles ){
            return false;
        }

        // Si el rol es un array, verificar intersección
        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 );
        // Retornar array vacío si no hay usuario, sino retornar roles
        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 );

        // Si el rol es un array, verificar intersección
        if( is_array( $role ) ){
            return array_intersect( $role, $user_roles ) ? true : false;
        }

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

Entonces puedes simplemente hacer esto:

current_user_has_role( 'editor' );

o

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

26 ago 2019 21:21:50
Comentarios

Acceder a propiedades de bajo nivel nunca es una buena idea en WP, seguramente no es la manera correcta. Si la pregunta para la que se busca respuesta es "¿Es el usuario actual un editor?" entonces usar current_user_can está perfectamente bien, de hecho, esa es exactamente la manera de hacerlo. El hecho de que sea preferible usar capacidades para "proteger" operaciones es un tema diferente. Conocer el rol de un usuario puede ser algo legítimo, y en ese caso, current_user_can es perfectamente válido de usar.

gmazzap gmazzap
18 mar 2021 20:59:27

@gmazzap entonces ¿por qué específicamente dice "Aunque la comprobación contra roles particulares en lugar de una capacidad está parcialmente soportada, esta práctica es desaconsejada ya que puede producir resultados poco fiables" en la página de documentación de current_user_can? Parece que la documentación y tu comentario se contradicen, aunque entiendo lo que dices. Dicho esto, $roles es una propiedad pública en el objeto WP_User y lo ha sido desde la versión 2.0.0. https://developer.wordpress.org/reference/functions/current_user_can/

sMyles sMyles
18 mar 2021 21:32:05

La documentación se refiere al hecho de que, por ejemplo, un editor normalmente puede editar entradas. Así que podrías estar tentado a comprobar si el usuario es un editor para permitir editar una entrada. Eso es incorrecto porque tal vez la capacidad fue filtrada de modo que el usuario, a pesar de ser editor, no debería editar la entrada. Y puede ser al revés, un suscriptor podría tener permitido editar entradas o solo esa entrada específica. Comprobar la capacidad asegura que esos resultados esperados sean respetados.

gmazzap gmazzap
31 mar 2021 09:46:13

Dicho esto, hacer la pregunta "¿Es este usuario un editor?" podría seguir siendo una pregunta legítima. No deberías preguntarlo para determinar si un usuario tiene permiso o no para hacer algo, pero podrías hacer esa pregunta por alguna otra razón. Y si ese es el caso, entonces usar current_user_can con el nombre del rol está bien.

gmazzap gmazzap
31 mar 2021 09:47:39

Con respecto a los roles, sí, es una propiedad pública en la que puedes confiar que estará ahí, pero current_user_can tiene filtros, por ejemplo, https://developer.wordpress.org/reference/hooks/user_has_cap/ o https://developer.wordpress.org/reference/hooks/map_meta_cap/. Si un plugin o cualquier otra cosa está usando esos filtros para cambiar lo que devuelve current_user_can, al verificar directamente la propiedad de roles te perderás los filtros, y por lo tanto reducirás la compatibilidad de tu código con otros códigos.

gmazzap gmazzap
31 mar 2021 09:56:06
0

Para administrador

$current_user = wp_get_current_user();
if (!in_array('administrator', $current_user->roles)) {
   //hacer algo
}

Para editor

$current_user = wp_get_current_user();
if (!in_array('editor', $current_user->roles)) {
      //hacer algo
}

Ten en cuenta que esto solo funciona si deseas verificar los roles del usuario actual. Si necesitas verificar cualquier otro usuario específico, debes usar get_user_by (https://developer.wordpress.org/reference/functions/get_user_by/) o métodos similares para obtener el usuario que deseas verificar

22 may 2023 10:09:37
4
-2
<?php if( current_user_can('editor')) :
  echo "bienvenido";
elseif( current_user_can('member')) :
  echo "bienvenido";
else :
 wp_die("<h2>Para ver esta página primero debes <a href='". wp_login_url(get_permalink()) ."' title='Iniciar sesión'>iniciar sesión</a></h2>");
endif;
?>
29 sept 2016 20:26:21
Comentarios

Sería excelente si pudieras explicar cómo ayuda esto al autor de la pregunta.

bravokeyl bravokeyl
29 sept 2016 20:32:54

Puedes permitir que la página sea visible solo para "editor" o "miembro" si colocas este código directamente en generic-page.php

seowmx seowmx
29 sept 2016 20:36:28

Por favor, no solo publiques código. Añade comentarios y alguna explicación de cómo esto resuelve el problema de quien pregunta.

kraftner kraftner
29 sept 2016 21:09:04

¿Entonces tu respuesta es duplicar el código para cada rol?

Julix Julix
22 oct 2019 20:20:47
2
-3

Las respuestas correctas a la solución-pregunta anterior son por programación básica else:

if( current_user_can('administrator')) { 

<!-- solo el administrador verá este mensaje -->

} else { 

        if( wp_get_current_user('editor')) {

<!-- solo el editor pero no el administrador verá este mensaje -->

?>
<style type="text/css">#perhapsDIVremovalidentifier{
display:none;
</style>
}
<?php
} else {

<!-- el usuario no es ni editor ni administrador -->

}}  

Resumen: Se encuentra el administrador, pero si comprobamos el editor también se encuentra el administrador. Así que solo dejamos pasar al administrador e identificamos únicamente al editor.

Recuerda que siempre debes usar este código para llamar al anterior y minimizar el uso de CPU:

if(is_user_logged_in()){}
3 jun 2020 22:18:43
Comentarios

Eso es exactamente lo que está indicado en la pregunta, y lo que el autor no quiere.

fuxia fuxia
4 jun 2020 00:15:03

He agregado breve para que no haya malentendidos. Era difícil seguir las reglas del else, creo.

Dealazer Dealazer
4 jun 2020 11:52:43