Comprobar si un usuario es administrador por ID de usuario

27 ago 2016, 14:40:39
Vistas: 20.1K
Votos: 10

¿Alguna idea de cómo comprobar si un usuario (por ID de usuario) es administrador? No me refiero al usuario actualmente conectado.

2
Comentarios

user_can( $user_id, "manage_options" ) o in_array( "administrator", get_userdata( $user_id ) ). is_admin() indica si estás en la pantalla de administración (panel de control, etc.)

Ismail Ismail
27 ago 2016 15:02:26

@SamuelElh como respuesta, por favor. :)

Rarst Rarst
27 ago 2016 15:43:44
Todas las respuestas a la pregunta 3
0
21

Lo expresaste como si quisieras verificar si el usuario tiene el rol de administrador. Se considera más apropiado verificar la capacidad, relevante para la acción específica.

En la práctica, esto generalmente se expresa como current_user_can( 'manage_options' ) para el usuario actual. Para un usuario arbitrario sería user_can( $user_id, 'manage_options' ).

Por supuesto, esta es una capacidad que representa la configuración general del sitio. Dependiendo de tu propósito, podrías querer usar una diferente, consulta la lista en la documentación de roles y capacidades.

27 ago 2016 15:49:19
2

Solo estoy agregando a la respuesta de @Rarst.

Técnicamente puedes proporcionar el nombre del rol a esas funciones, por lo que current_user_can( 'administrator' ) o user_can( $user_id, 'administrator' ) también funcionarían, pero esto está desaconsejado.

Aunque verificar roles específicos en lugar de capacidades es parcialmente compatible, esta práctica no se recomienda ya que puede producir resultados poco confiables.

Nota: Siempre devolverá true si el usuario actual es un super administrador, a menos que se deniegue específicamente.

Podrías verificar el rol sin depender de esas funciones (ya que son poco confiables), pero como dijo @Rarst, es más adecuado verificar capacidades en lugar del rol.

Una de las principales ventajas de usar capacidades en lugar de roles es la siguiente.

Tomemos como ejemplo que tienes más de un administrador en tu sitio. Digamos que quieres que tu cliente sea administrador, y tú también eres administrador del sitio.

Ahora tiene sentido que tu cliente tenga privilegios de administrador sobre su sitio, pero quizás no quieras que él/ella tenga la capacidad de instalar plugins en el sitio. Ese sería tu trabajo como webmaster.

Entonces, si verificas por roles, estás limitado a deshabilitar/habilitar funcionalidades para todos dentro de ese rol.

Ahora bien, si usas capacidades, tendrías un mayor control granular para otorgar/restringir a los usuarios acciones específicas.

Volviendo a mi escenario, si deseas darle privilegios de administrador a tu cliente pero no permitirle instalar plugins, sería tan simple como:

add_filter( 'user_has_cap', 'client_admin_cap_filter', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){

  // la capacidad solicitada y el ID de nuestro usuario cliente
  if ( 'install_plugins' == $args[0] && $args[1] == 2 ) 
    $allcaps[ $cap[0] ] = false;
  
  return $allcaps;
}

Podríamos proporcionar un array de diferentes capacidades que quisiéramos restringir, por ejemplo update_core, manage_options, install_plugins, install_themes, etc.

Nuestra función seguiría siendo bastante simple:

add_filter( 'user_has_cap', 'client_admin_cap_filter', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){

  $restricted_cap = array( 
    'update_core',
    'manage_options',
    'install_plugins',
    'install_themes',
     // etc.
  );

  foreach( $restricted_cap as $r_cap ){

    // la capacidad solicitada y el ID de nuestro usuario cliente
    if ( $r_cap == $args[0] && $args[1] == 2 ) 
      $allcaps[ $cap[0] ] = false;

  } 
  
  return $allcaps;
}

Como puedes ver, esto es bastante efectivo, no requiere un rol especial, no agrega una consulta adicional a la base de datos, se ejecuta en tiempo de ejecución y es fácilmente escalable y mantenible.

Si tu lógica depende de un rol, bueno, buena suerte apuntando a usuarios específicos, escenarios o lo que sea sin arrancarte los pelos o crear un montón de roles solo para mantenerte al día con todos los casos de uso posibles.

Consulta el codex para más información sobre el filtro user_has_cap.

31 ago 2016 07:38:33
Comentarios

"Si bien verificar roles específicos en lugar de una capacidad es parcialmente compatible, esta práctica no se recomienda ya que puede producir resultados poco confiables." -> https://developer.wordpress.org/reference/functions/current_user_can/

cybmeta cybmeta
31 ago 2016 07:53:08

Buen hallazgo, actualicé mi respuesta para incluir la cita

bynicolas bynicolas
31 ago 2016 08:02:31
0

Puedes usar get_userdata() o get_user_by() pasando el ID de usuario para obtener el objeto de usuario. Desde ahí puedes obtener el rol.

$user = get_userdata( $user_id );
if(!empty( $user ) && $user){
   $user->roles // esto contiene el rol, aquí puedes verificar el rol que necesites
}

Puedes consultar esta respuesta para más información

27 ago 2016 14:57:05