En WordPress los usuarios pueden tener asiganados roles (autor, editor, administrador, etc) y compentencias (capabilities: editar posts, subir imágenes, etc). Cada usuario puede tener más de un rol asignado y esta información se alamacena en la propiedad roles del objeto WP_User:

//Obtener el objeto WP_User del usuario actual
$user = wp_get_current_user();
//Ver todos los roles asignados
var_dump($user->roles);

En $user->roles tendremos un array con todos los roles del usuario. Así que se puede comprobar el rol de un usuario fácilmente con in_array. Por ejemplo, si queremos comprobar si el usuario actual es editor podríamos hacer:

$user = wp_get_current_user();
if( ! empty( $user ) && in_array( "editor", (array) $user->roles ) ) {
    //El usuario actual es editor
}

Si en lugar de comprobar el rol del usuario actual queremos hacerlo con otro usuario cualquiera, por ejemplo con el usuario de ID = 125:

$user = get_userdata( 125 );
if( ! empty( $user ) && in_array( "editor", (array) $user->roles ) ) {
    //El usuario actual es editor
}

Y por cierto, nunca utilices current_user_can para comprobar roles de usuario aunque lo veas en numerosas fuentes de Internet, avisado estás.

  • Franz Armas

    Hola, gracias por los tutoriales.. eh querido poner a prueba lo leído en tu blog por que tengo la necesidad en un sitio web de un cliente, y lo que basicamente quiero es cambiar las capacidades por defecto del rol de Editor.. quiero agregar por ejemplo que todos los usuarios con rol ‘Editor’ puedan borrar usuarios.

    Mirando tus dos tutoriales al respecto de roles y capacidades, he creado un plugin básico para no depender del functions.php del tema y eh puesto estas lineas, pero no esta funcionando 🙁

    $user = wp_get_current_user();
    if( ! empty( $user ) && in_array( "editor", (array) $user->roles ) ) {
      $perfil = get_role('editor');
      $perfil->add_cap('delete_users');
    }

    Que podría estar haciendo mal ?? Espero puedas ayudarme. Gracias!

    • Hola Franz,

      Como le vas a añadir esa capacidad a un role, y no a un usuario en concreto, no necesitas todo el código para obtener el “usuario”, solo el rol:

      $editor_role = get_role('editor');
      $editor_role->add_cap('delete_users');

      Estos cambios se almacenan en la base de datos, y por tanto hay que tener cuidado en que no se ejecuten en cada carga. En este caso concreto sería buena opción añadir la capacidad al activar el plugin y quitarla al desactivar el plugin para revertir el efecto si ya no se utiliza el plugin:

      register_activation_hook( __FILE__, 'cyb_plugin_activation' );
      function cyb_plugin_activation() {
      $editor_role = get_role( 'editor' );
      $editor_role->add_cap( 'delete_users' );
      }

      register_deactivation_hook( __FILE__, 'cyb_plugin_deactivation' );
      function cyb_plugin_deactivation() {
      $editor_role = get_role( 'editor' );
      $editor_role->remove_cap( 'delete_users' );
      }

      Con el código anterior, cualquier usuario con rol editor tendrá la capacidad delete_users, pero no podrá acceder aún a la pantalla de usuarios en el backend, para acceder a esa pantalla necesita además la capacidad list_users:

      register_activation_hook( __FILE__, 'cyb_plugin_activation' );
      function cyb_plugin_activation() {
      $editor_role = get_role( 'editor' );
      $editor_role->add_cap( 'delete_users' );
      $editor_role->add_cap( 'list_users' );
      }

      register_deactivation_hook( __FILE__, 'cyb_plugin_deactivation' );
      function cyb_plugin_deactivation() {
      $editor_role = get_role( 'editor' );
      $editor_role->remove_cap( 'delete_users' );
      $editor_role->remove_cap( 'list_users' );
      }

      PD: la pregunta no es sobre el tema del post (“Comprobar capacidades”) y por eso sería mejor si utilizas el foro de WordPress.org, allí podemos tener una conversación más extendida si lo necesitas y a la vez esa conversación le podrá servir a muchos más usuarios.

  • iván Ramos

    Gracias mil, me ha ayudado mucho, me pregunto si es posible obtener directamente el rol de mas peso. Gracias.

    • Hola Iván,

      Creo que el concepto de “rol con más peso” no está recogido en el sistema actual de roles y capacidades de WordPress. De hecho, se podría por ejemplo asignar capacidad para instalar plugins a un suscriptor, ¿que rol tendría entonces más peso, un suscriptor o un autor?

      ¿Qué es lo que quieres hacer exactamente? ¿Podrías describirlo? Probablemente estés cayendo en un problema X-Y.

    • iván Ramos

      Entiendo no obstante la idea inicial era mostrar el rol con mas peso, no contemplo la posibilidad de que un suscriptor pueda instalar un plugin por que en este caso no sera posible.

      No obstante solo pretendia mostrar una informacion no demasiado relevante para el funcionamiento del plugin pero que puede resultar de interes, ya lo he conseguido gracias a tu entrada.

      Una vez mas gracias.

    • Evidentemente era un ejemplo extremo, nadie va a dar permisos a un suscriptor para que instale plugins.

      He estado dando vueltas a esto y el concepto de rol con “más peso” puede existir pero definitivamente no hay forma de saber con seguridad las capacidades asociadas a un usuario concreto en base a su rol.

      Tampoco hay forma de saber que roles tienen más peso de forma universal sino que es algo propio de cada caso. Imagina que yo desarrollo un plugin en el que creo dos roles, una llamado “Azul” y otro llamado “Rojo”. Ahora tú instalas mi plugin en tu sitio y quieres obtener el rol con más peso; tendrás que estudiar el plugin o no tendrás ni idea de que rol tiene mayores capacidades.

      Por eso hay que comprobar SIEMPRE las capacidades de usuario y no sus roles en las cuestiones que necesiten comprobar los niveles de acceso. No como antes que estaban los “user levels” (depreciados en WordPress 3.0); eso si era un sistema de “pesos” real; el sistema de roles y capacidades es mucho más flexible y lo que importa realmente son las capacidades del usuario y no el rol asignado.

      No sé si consigo transmitir la idea. Espero que sí. En resumen, no hay un sistema de niveles o pesos estandarizado y cada desarrollador puede definir roles con más o menos peso a su antojo sin que haya una forma universal de conocer cuál de ellos tiene capacidades más amplias; habría que estudiar cada caso concreto.

    • Por si te interesa, unas reflexiones más al respecto: https://cybmeta.com/comprobar-capacidades-y-no-roles

    • iván Ramos

      Si claro que lo he comprendido, entiendo que el rol puede ser algo subjetivo e incluso diria incoherente, de hecho tengo plateado usar mi propio sistema de niveles. En mi caso el plugin es para una función muy concreta que no esta orientada a una web convencional, es mas, diría que no es o será una web si no mas bien una intranet.

      Entendiendo el sistema de roles de wordpress pretendo prescindir en cierta
      medida de ellos, pero sí que es necesario saber al menos que usuario es
      administrador en wordpress, entendiendo que estos serán los únicos usuarios con capacidad de configurar el plugin.

      De ahí que necesariamente el resto de roles serán limitados al máximo para que solo los administradores puedan realizar cambios en la configuración.

      El hecho u ocurrencia de querer saber el de mas peso a sido solo por una cuestión de curiosidad ya que soy nuevo en WP y de momento todo lo que estoy haciendo es experimentando para ver si es posible llevar a cabo este proyecto sobre wp. Ya que me parece muy cómodo programar en wp.

    • Ahí está, das por hecho que un usuario con rol “administrador” tendrá cierta competencia, pero no es así. Yo puedo ser un super admin y crear mi web de tal modo que el resto de admins no puedan cambiar la configuración (la capacidad “manage_options” de WordPress). Así que en lugar de verificar si el usuario es “admin” deberías comprobar directamente si el usuario puede “manage_options”.

      En lugar de hacer:

      $user = wp_get_current_user();

      if( ! empty( $user ) && in_array( "admin", (array) $user->roles ) ) {
      // El usuario actual es admin
      }

      Deberías haceR:

      if( current_user_can('manage_options') ) {
      // El usuario actual puede cambiar la configuración
      }

      Entiendo que para tu situación concreta y en este momento te pueda parecer irrelevante, pero quién sabe hacia dónde irá la aplicación que estás montando. Si lo haces con la segunda opción te aseguras el funcionamiento correcto en cualqueir situación y a largo plazo.

    • iván Ramos

      Bueno pues eso es precisamente lo que buscaba, pero no sabia como enfocarlo en wp.

      Por cierto me parece estupenda esta web.