Si l'utilisateur actuel est un administrateur ou un éditeur
-
-
`if (current_user_can ('editor')|| current_user_can ('administrator'))``if( current_user_can('editor') || current_user_can('administrator') )`
- 10
- 2014-01-30
- Shazzad
-
5 réponses
- votes
-
- 2014-01-30
Première réponse,pas liée à WordPress carilne s'agit que de PHP: utilisez l'opérateur logique "OU":
<?php if( current_user_can('editor') || current_user_can('administrator') ) { ?> // Stuff here for administrators or editors <?php } ?>
Si vous souhaitez vérifierplus de deux rôles,vouspouvez vérifier si les rôles de l'utilisateur actuel setrouvent dans untableau de rôles,quelque chose comme:
$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 } ?>
Cependant,
current_user_can
peut être utilisénon seulement avec les utilisateursnom du rôle,mais aussi avec desfonctionnalités.Ainsi,unefois que les éditeurset les administrateurspeuventmodifier despages,votre viepeut êtreplusfacile à vérifierpour cesfonctionnalités:
<?php if( current_user_can('edit_others_pages') ) { ?> // Stuff here for user roles that can edit pages: editors and administrators <?php } ?>
Regardez ici pourplus d'informations sur lesfonctionnalités.
First answer, not WordPress-related because it is just only PHP: Use the logic "OR" operator:
<?php if( current_user_can('editor') || current_user_can('administrator') ) { ?> // Stuff here for administrators or editors <?php } ?>
If you want to check more than two roles, you can check if the roles of the current user is inside an array of roles, something like:
$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 } ?>
However,
current_user_can
can be used not only with users' role name, but also with capabilities.So, once both editors and administrators can edit pages, your life can be easier checking for those capabilities:
<?php if( current_user_can('edit_others_pages') ) { ?> // Stuff here for user roles that can edit pages: editors and administrators <?php } ?>
Have a look here for more information on capabilities.
-
avez-vousbesoin de vérifier si `is_logged_in ();`?do you need to check if `is_logged_in();` ?
- 1
- 2017-05-01
- RobBenz
-
@RobBenznon,dans aucun des cas.Parce que `current_user_can ()` retournetoujoursfalse si l'utilisateurn'estpas connecté,et `wp_get_current_user ()` retournera un utilisateur sans aucun rôle si l'utilisateurn'estpas connecté,donc le `array_intersect ()` seratoujoursfaux.@RobBenz no, in any of the cases. Because `current_user_can()` always returns false if the user is not logged in, and `wp_get_current_user()` will return an user without any role if the user is not logged in, so the `array_intersect()` will always be false.
- 3
- 2017-05-01
- gmazzap
-
Dans le PHPDoc de lafonction `current_user_can ()`,nouspouvons voir la ligne "_Bien que la vérificationpar rapport à des rôlesparticuliers à laplace d'une capacité soit supportéeen partie,cettepratiqueest déconseillée carellepeutproduire des résultatspeufiables_".Jepense donc qu'il seraitpréférable d'éviter d'utiliser des rôles lors de la vérification des capacités d'un utilisateur :-)In the PHPDoc of the `current_user_can()` function, we can see the line "_While checking against particular roles in place of a capability is supported in part, this practice is discouraged as it may produce unreliable results_". So I think it would be better to avoid using roles while checking for a user's capability :-)
- 3
- 2017-09-01
- Erenor Paz
-
Lorsquej'utilise laméthode `array_intersect`,j'obtiens un avertissement PHP dansnotrejournal deserreurs de serveur disant` array_intersect (): L'argument # 2n'estpas untableau`.Est-ceparce que les utilisateurs vérifiésn'ont qu'un seul rôle?When I use the `array_intersect` method, I get a PHP warning in our server error log saying `array_intersect(): Argument #2 is not an array`. Is this because the user(s) it's checking only have one Role?
- 0
- 2018-01-23
- Garconis
-
@Garconisnormalement,ce devrait être untableau.Pour une raison quelconque,il semble que cene soitpas untableau.`array_intersect ($ allowed_roles,(array) $ user-> roles)`fonctionnera sansproblème.@Garconis normally it should be an array. For some reason it seems for you is not an array. `array_intersect($allowed_roles, (array)$user->roles )` will work with no issues.
- 0
- 2018-01-25
- gmazzap
-
Je déconseille de vérifier les rôles ...et plutôt les capacités.Ilestplusfacile de supprimer ou d'ajouter une capacité à unensemble de rôles ... c'estplusexplicite.`current_user_can ('edit_orderform')`parexemple ...peut-être qu'un représentant commercial devrait UNIQUEMENT êtreen mesure demodifier leformulaire de commande ...maispas les droitspour ajouter du contenu.L'octroiexplicite de cette capacitéest une structure d'autorisationsplusexplicite que le rôle d'un utilisateur.Lesgensportentplusieurs chapeaux dans lesgrandes organisations.vouspouvez avoir des abonnés qui ontplus d'accès que la simple lecture.I'd advise against checking against roles... and rather against capabilities. It's easier to remove or add a capability to a set of roles... it's more explicit. `current_user_can('edit_orderform')` for example... maybe a Salesrep should ONLY be able to edit the order form... but not have the rights to add content. Explicitly granting that capability is a more explicit permissions structure than what role a user is. People wear multiple hats in larger organizations. you can have subscribers that have more access than just reading.
- 0
- 2019-05-13
- Armstrongest
-
- 2019-01-06
Premièrement,
current_user_can()
ne doitpas être utilisépour vérifier le rôle d'un utilisateur -il doit être utilisépour vérifier si un utilisateur a une capacité spécifique.Deuxièmement,plutôt que de vouspréoccuper du rôle de l'utilisateurmaisplutôt de vous concentrer sur les capacités,vousn'avezpas à vous soucier defaire des choses comme leproblèmeposé dans la question d'origine (qui vérifie si l'utilisateurest un administrateur OU unéditeur).Au lieu de cela,si
current_user_can()
était utilisé commeprévu,c'est-à-direpour vérifier les capacités d'un utilisateur,pas son rôle,vousn'auriezpasbesoin de la vérification conditionnellepour contenir unTest "ou" (||).Parexemple:if ( current_user_can( 'edit_pages' ) ) { ...
edit_pagesest une capacité des rôles d'administrateuret d'éditeur,maispas des rôlesinférieurstels que les auteurs.C'est ainsi que
current_user_can()
était censé être utilisé.First,
current_user_can()
should not be used to check a user's role - it should be used to check if a user has a specific capability.Second, rather than being concerned with the user's role but instead focusing on capabilities, you don't have to bother with doing things like the problem asked about in the original question (which is checking if the user is an administrator OR an editor). Instead, if
current_user_can()
was being used as intended, which is to check for a user's capabilities, not their role, you wouldn't need the conditional check to contain an "or" (||) test. For example:if ( current_user_can( 'edit_pages' ) ) { ...
edit_pages is a capability of both administrator and editor roles, but not any lower roles such as authors. This is how
current_user_can()
was intended to be used.-
** Veuilleznoter **: les développeurs WP de hautniveau sont d'accord avec cette réponse.Vous devriezessayer d'éviter autant quepossible la vérification des rôles,utilisez des capacités.Jetravaille actuellement sur unprojet avecplusieurs rôles quin'ont que leplafond «lecture».La seule solutionest la vérification des rôlespourmoi.Désolé,je netrouvepas le lien,c'était une discussion ouverte sur le WP Github.**Please note**: High level WP devs agree with this answer. You should try to avoid role checking as much as possible, use capabilties. I'm currently working on a project with multiple roles that only have the 'read' cap. The only solution is role checking for me. Sorry, I can't find the link, it was an open discussion on the WP Github.
- 3
- 2019-04-26
- Bjorn
-
Cela devrait être la réponse acceptée,OMI.`current_user_can` doitgénéralement être utilisépour les capacités,pas les rôles.This should be the accepted answer, IMO. `current_user_can` should generally be used for capabilities, not roles.
- 1
- 2019-05-13
- Armstrongest
-
+1pour cela,évitez de vérifier les rôles via `current_user_can ()`.Si vous souhaitez vérifier les rôlespar clé,effectuez une vérification des rôles au lieu d'une vérification desplafonds :)+1 to this, avoid checking roles via `current_user_can()`. If you want to check roles by key then perform a role check instead of a cap check :)
- 0
- 2020-03-05
- William Patton
-
Quelleest alors lafonction appropriéepour vérifier les rôles des utilisateursexplicitementet entoute sécurité?Il semble que ce soit unpeu difficile àtrouver (s'ilexiste).@BjornWhat is the proper function then, for checking user roles explicitly & safely? It seems, it's a bit hard to find that (if exists). @Bjorn
- 0
- 2020-04-15
- Viktor Borítás
-
@Viktor Borítás Ilexisteplusieurs solutions valables sur cettepage.Maisne les utilisez que si `current_user_can ()`n'estpas une option.Deplus,mon commentaireest davantagebasé sur la sécurité.Parexemple,si vous souhaitez restreindre le contenupour des utilisateurs spécifiques dans laplupart des cas,une vérification de capacitéest suffisantepour cettetâche.@Viktor Borítás There are multiple valid solutions on this page. But only use them if `current_user_can()` is not an option. Also, my comment is more security based. For example, if you want to restrict content for specific users in most cases a capability check is sufficient for this task.
- 1
- 2020-04-16
- Bjorn
-
- 2019-08-26
Comme l'indique la réponse de @butlerblog, vousne devezpas utiliser current_user_canpour vérifierpar rapport à un rôle
Cet avisest spécifiquement ajouté dans la documentation PHP de lafonction
has_cap
quiest appeléeparcurrent_user_can
Bien que la vérificationpar rapport à un rôle à laplace d'une capacité soitpartiellementpriseen charge,cettepratiqueest déconseillée carellepeutproduire des résultatspeufiables.
Laméthode CORRECT pour cefaireest d'obtenir l'utilisateuret de vérifier les
$user->roles
,comme ceci: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 ); } }
Voici quelquesfonctions d'aide quej'utilisepourfaire cela (carparfoisje ne veuxpas seulement l'utilisateur actuel):
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 ); } }
Ensuite,vouspouvez simplementfaire ceci:
current_user_has_role( 'editor' );
ou
current_user_has_role( array( 'editor', 'administrator' ) );
As @butlerblog reply stated, you should not use current_user_can to check against a role
This notice is specifically added in the PHP documentation of
has_cap
function which is called bycurrent_user_can
While checking against a role in place of a capability is supported in part, this practice is discouraged as it may produce unreliable results.
The CORRECT way to do this is to get the user and check the
$user->roles
, like this: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 ); } }
Here's some helper functions I use to do this (as sometimes i don't want just current user):
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 ); } }
Then you can just do this:
current_user_has_role( 'editor' );
or
current_user_has_role( array( 'editor', 'administrator' ) );
-
- 2016-09-29
<?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; ?>
<?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; ?>
-
Ce seraitformidable si vouspouviezexpliquer comment cela aide OP.It would be great if you could explain as how it helps OP.
- 1
- 2016-09-29
- bravokeyl
-
Vouspouvez autoriser à voir lapage uniquement "éditeur" ou "membre" vouspouvezposter ce code directement dansgeneric-page.phpYou can allow to see the page only "editor" or "member" you can post this code direct in generic-page.php
- 0
- 2016-09-29
- seowmx
-
Veuillezne pas simplement laissertomber le code.Ajoutez des commentaireset expliquez comment cela résout leproblème des demandeurs.Please don't just drop code. Add comments and some explanation how this solves the askers problem.
- 5
- 2016-09-29
- kraftner
-
Donc,votre réponseest la duplication de codepour chaque rôle?So your answer is code duplication for each role?
- 0
- 2019-10-22
- Julix
-
- 2020-06-03
Lesbonnes réponses à la question-solution ci-dessus sontpar ailleurs laprogrammationbasique:
if( current_user_can('administrator')) { <!-- only administrator will see this message --> } else { if( wp_get_current_user('editor')) { <!-- only editor but no administrator will see this message --> ?> <style type="text/css">#perhapsDIVremovalidentifier{ display:none; </style> } <?php } else { <!-- the user is neither editor or administrator --> }}
Bref: L'administrateuresttrouvé,mais sinouspoussons l'éditeur,l'administrateurest égalementtrouvé.Nous laissons donc simplement l'administrateurpasseret identifier l'éditeur uniquement.
N'oubliezpas que vous deveztoujours utiliser ce codepour appeler cela ci-dessus afin deminimiser l'utilisation du code duprocesseur:
if(is_user_logged_in()){}
The correct answers to the above solution-question are by else programming basic:
if( current_user_can('administrator')) { <!-- only administrator will see this message --> } else { if( wp_get_current_user('editor')) { <!-- only editor but no administrator will see this message --> ?> <style type="text/css">#perhapsDIVremovalidentifier{ display:none; </style> } <?php } else { <!-- the user is neither editor or administrator --> }}
Brief: The administrator is found, but if we push editor the administrator is as well found. So we just let the administrator pass through and identify the editor only.
Remember you should always use this code to call that above to minimize cpu code usage:
if(is_user_logged_in()){}
-
C'estexactement ce quiest dit dans la ** question **,et ce que l'auteurne veutpas.That is exactly what is stated in the **question**, and what the author doesn't want.
- 0
- 2020-06-03
- fuxia
-
J'ai ajouté unbref afin quenousn'ayons aucunmalentendu.Il était difficile de suivre les autres règles,je crois.I've added brief so that we have no misunderstanding. It was hard to follow the else rules I believe.
- 0
- 2020-06-04
- Dealazer
Commentpuis-je vérifier si l'utilisateur actuellement connectéest un administrateur ou un éditeur?
Je sais commentfaire chacunindividuellement:
Mais comment lestravaillerensemble?C'est-à-dire que l'utilisateurest un administrateur ou un éditeur?