web-dev-qa-db-fra.com

Vérifier si l'utilisateur est admin par ID utilisateur

Des idées comment vérifier si l'utilisateur ( par ID d'utilisateur ) est administrateur? Je ne parle pas de l'utilisateur actuellement connecté.

5
jmeinlschmidt

Vous l'avez libellé comme vous voulez vérifier si l'utilisateur a l'administrateur rôle. Il est considéré comme plus approprié de vérifier capacité, correspondant à une action spécifique.

En pratique, cela s’exprime généralement par current_user_can( 'manage_options' ) pour l’utilisateur actuel. Pour un utilisateur arbitraire, ce serait user_can( $user_id, 'manage_options' ).

Bien sûr, cette capacité représente la configuration générale du site. Selon votre objectif, vous voudrez peut-être en utiliser un autre, voir la liste dans documentation sur les rôles et fonctionnalités .

13
Rarst

J'ajoute simplement à la réponse @Rarst.

Techniquement, vous pouvez fournir le nom du rôle à ces fonctions. Ainsi, current_user_can( 'administrator' ) ou user_can( $user_id, 'administrator' ) fonctionnerait également, mais il est déconseillé .

Même si la prise en charge de certains rôles au lieu d’une capacité est prise en charge, cette pratique est déconseillée car elle peut produire des résultats peu fiables.

Remarque: Renverra toujours la valeur true si l'utilisateur actuel est un super administrateur, sauf en cas de refus spécifique.

Vous pouvez vérifier le rôle sans utiliser ces fonctions (car elles ne sont pas fiables), mais comme @Rarst l'a dit, il est plus approprié de vérifier les capacités plutôt que le rôle.

Les principaux avantages d’utiliser des fonctionnalités plutôt que des rôles sont les suivants.

Prenons l'exemple de plusieurs administrateurs sur votre site. Supposons que vous souhaitiez que votre client soit administrateur et que vous soyez également administrateur du site.

Il est donc logique que votre client dispose des privilèges d’administrateur sur son site, mais vous ne souhaitez peut-être pas qu’il ait la possibilité d’installer des plugins sur le site. Ce serait votre travail en tant que webmaster.

Donc, si vous vérifiez les rôles, vous êtes bloqué pour désactiver/activer les fonctionnalités de tout le monde au sein de ce rôle.

Désormais, si vous utilisez des fonctionnalités, vous obtiendrez plus de précision sur l’octroi/la limitation des utilisateurs à des actions spécifiques.

De retour à mon scénario, si vous voulez donner à votre client des privilèges d’administrateur mais ne pas pouvoir installer de plugins, ce serait aussi simple que

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

  // the requested capability and our client user id 
  if ( 'install_plugins' == $args[0] && $args[1] == 2 ) 
    $allcaps[ $cap[0] ] = false;

  return $allcaps;
}

nous pourrions fournir un éventail de fonctionnalités que nous voudrions limiter, par exemple update_core, manage_options, install_plugins, install_themes, etc.

Notre fonction serait encore assez 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 ){

    // the requested capability and our client user id 
    if ( $r_cap == $args[0] && $args[1] == 2 ) 
      $allcaps[ $cap[0] ] = false;

  } 

  return $allcaps;
}

Comme vous pouvez le constater, cette méthode est assez efficace, ne nécessite pas de rôle spécial, n’ajoute pas de requête de base de données supplémentaire, est exécutée à l’exécution et est facilement évolutive et facile à gérer.

Si votre logique dépend d'un rôle, bonne chance pour cibler des utilisateurs spécifiques, des scénarios ou des trucs sans vous arracher les cheveux ni créer un nombre incroyable de rôles, rien que pour faire face à tous les cas d'utilisation possibles.

Vérifiez le codex pour plus d’informations sur le filtre user_has_cap .

3
bynicolas

Vous pouvez utiliser get_userdata () ou get_user_by () en passant l'id de l'utilisateur pour obtenir un objet utilisateur. À partir de laquelle vous obtenez le rôle.

$user = get_userdata( $user_id );
if(!empty( $user ) && $user){
   $user->roles // this contains the role here check for whatever role you need
}

Vous pouvez vérifier ceci répondre pour plus

3
bravokeyl