Se l'utente corrente è un amministratore o un editore
-
-
`if (current_user_can ('editor')|| current_user_can ('administrator'))``if( current_user_can('editor') || current_user_can('administrator') )`
- 10
- 2014-01-30
- Shazzad
-
5 risposta
- voti
-
- 2014-01-30
Prima risposta,non correlata a WordPressperché è solo PHP: usa l'operatore logico "OR":
<?php if( current_user_can('editor') || current_user_can('administrator') ) { ?> // Stuff here for administrators or editors <?php } ?>
Se desideri controllarepiù di due ruoli,puoi verificare sei ruoli dell'utente corrente sitrovano all'interno di un array di ruoli,qualcosa come:
$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 } ?>
Tuttavia,
current_user_can
puòessere utilizzatonon solo congli utenti 'nome del ruolo,ma anche con capacità.Quindi,una volta che siaglieditor chegli amministratoripossonomodificare lepagine,latua vitapuòesserepiùfacile controllando questefunzionalità:
<?php if( current_user_can('edit_others_pages') ) { ?> // Stuff here for user roles that can edit pages: editors and administrators <?php } ?>
Dai un'occhiata qui per ulterioriinformazioni sulle capacità.
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.
-
devi controllare se `is_logged_in ();`?do you need to check if `is_logged_in();` ?
- 1
- 2017-05-01
- RobBenz
-
@ RobBenzno,in nessuno dei casi.Perché `current_user_can ()` restituisce semprefalse se l'utentenon è loggato,e `wp_get_current_user ()` restituirà un utente senza alcun ruolo se l'utentenon è loggato,quindi `array_intersect ()` sarà semprefalso.@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
-
Nel PHPDoc dellafunzione `current_user_can ()`,possiamo vedere la riga "_Mentreil controllo contro ruoliparticolari alposto di una capacità èin parte supportato,questapratica è sconsigliatain quantopotrebbeprodurre risultatiinaffidabili_".Quindipenso che sarebbemeglioevitare di usarei ruoli duranteil controllo delle capacità di un utente :-)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
-
Quando utilizzoilmetodo `array_intersect`,ricevo un avviso PHPnelnostro log deglierrori del server che dice` array_intersect (): L'argomento # 2non è un array`.Èperchégli utenti che sta controllando hanno un solo ruolo?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
-
@Garconisnormalmente dovrebbeessere un array.Per qualche ragione sembra cheperte non sia un array.`array_intersect ($ allowed_roles,(array) $ user-> roles)`funzionerà senzaproblemi.@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
-
Sconsigliereiil confronto coni ruoli ...e piuttosto contro le capacità.Èpiùfacile rimuovere o aggiungere unafunzionalità a uninsieme di ruoli ... èpiùesplicito.`current_user_can ('edit_orderform')`peresempio ...forse un Salesrep dovrebbe SOLOesserein grado dimodificareilmodulo d'ordine ...manon averei dirittiper aggiungere contenuto.La concessioneesplicita ditale capacità è una struttura di autorizzazionipiùesplicita rispetto al ruolo di un utente.Lepersoneindossanopiù cappellinelle organizzazionipiùgrandi.puoi avere abbonati che hannopiù accesso della semplice lettura.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
Innanzitutto,
current_user_can()
non dovrebbeessere utilizzatoper controllareil ruolo di un utente,ma dovrebbeessere usatoper verificare se un utente ha una capacità specifica.In secondo luogo,invece dipreoccuparti del ruolo dell'utentema concentrartiinvece sulle capacità,non devipreoccuparti difare cose comeilproblemapostonella domanda originale (che sta controllando se l'utente è un amministratore OPPURE uneditore).Seinvece
current_user_can()
fosse utilizzato comeprevisto,ovveroper verificare le capacità di un utente,non il suo ruolo,non sarebbenecessario cheil controllo condizionale contenga un"o" (||)test.Adesempio:if ( current_user_can( 'edit_pages' ) ) { ...
edit_pages è una capacità dientrambii ruoli di amministratoree dieditore,manon di ruoliinferiori comegli autori.Questo èilmodoin cui dovevaessere utilizzato
current_user_can()
.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.-
** Nota **:gli sviluppatori di WP di alto livello sono d'accordo con questa risposta.Dovresti cercare dievitareilpiùpossibileil controllo dei ruoli,utilizzare le capacità.Attualmente sto lavorando a unprogetto conpiù ruoli che hanno soloil limite di "lettura".L'unica soluzione èil controllo del ruoloperme.Mi spiace,non riesco atrovareil collegamento,era una discussione aperta su 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
-
Questa dovrebbeessere la risposta accettata,IMO."current_user_can" dovrebbegeneralmenteessere usatoper le capacità,nonperi ruoli.This should be the accepted answer, IMO. `current_user_can` should generally be used for capabilities, not roles.
- 1
- 2019-05-13
- Armstrongest
-
+1 a questo,evitare di controllarei ruolitramite `current_user_can ()`.Se desideri controllarei ruoliper chiave,esegui un controllo dei ruoliinvece di un controllo del limite :)+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
-
Qual è quindi lafunzione correttaper controllarei ruoli degli utentiin modoesplicitoe sicuro?Sembra,è unpo 'difficiletrovarlo (seesiste).@ 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 Ci sonopiù soluzioni validein questapagina.Ma usali solo se "current_user_can ()"non è un'opzione.Inoltre,ilmio commento èpiùbasato sulla sicurezza.Adesempio,se si desidera limitareil contenutoper utenti specificinellamaggiorparte dei casi,un controllo di capacità è sufficienteper questa attività.@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
Come ha affermato la risposta di @butlerblog,non dovresti utilizzare current_user_canper confrontare un ruolo
Questo avviso è specificamente aggiuntonella documentazione PHP dellafunzione
has_cap
che è chiamata dacurrent_user_can
Sebbeneil confronto con un ruolo alposto di una capacità siain parte supportato,questapratica è sconsigliatain quantopotrebbeprodurre risultatiinaffidabili.
Ilmodo CORRETTO perfarlo è ottenere l'utentee controllarei
$user->roles
,in questomodo: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 ); } }
Ecco alcunefunzioni di supporto che usoperfare ciò (poiché a voltenon voglio solo l'utente corrente):
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 ); } }
Quindipuoi semplicementefare questo:
current_user_has_role( 'editor' );
o
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; ?>
-
Sarebbefantastico sepotessi spiegare come aiuta OP.It would be great if you could explain as how it helps OP.
- 1
- 2016-09-29
- bravokeyl
-
Puoi consentire di vedere solo lapagina "editor" o "membro"puoiinserire questo codice direttamentein generic-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
-
Perfavore,non lasciare semplicementeil codice.Aggiungi commentie alcune spiegazioni su come questo risolveilproblema di chi chiede.Please don't just drop code. Add comments and some explanation how this solves the askers problem.
- 5
- 2016-09-29
- kraftner
-
Quindi latua risposta è la duplicazione del codiceper ogni ruolo?So your answer is code duplication for each role?
- 0
- 2019-10-22
- Julix
-
- 2020-06-03
Le risposte corrette alla domanda-soluzione di cui sopra sono di altroprogrammazione dibase:
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 --> }}
Breve: l'amministratore vienetrovato,ma se spingiamo l'editor vienetrovato anche l'amministratore.Quindi lasciamopassare l'amministratoree identifichiamo solo l'editor.
Ricorda che dovresti sempre utilizzare questo codiceper richiamarlo sopraper ridurre alminimo l'utilizzo del codice della CPU:
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()){}
-
Questo èesattamente ciò che èindicatonella ** domanda **e ciò che l'autorenon vuole.That is exactly what is stated in the **question**, and what the author doesn't want.
- 0
- 2020-06-03
- fuxia
-
Ho aggiuntobreviin modo danon averefraintendimenti.Credo sia stato difficile seguire le altre regole.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
Comeposso verificare se l'utente attualmente connesso è un amministratore o uneditore?
So comefare ciascunoindividualmente:
Ma comepossofarli lavorareinsieme?Cioè,l'utente è un amministratore o uneditore?