Se o usuário atual for um administrador ou editor
-
-
`if (acrent_user_can ('editor')|| current_user_can ('administrador'))``if( current_user_can('editor') || current_user_can('administrator') )`
- 10
- 2014-01-30
- Shazzad
-
5 respostas
- votos
-
- 2014-01-30
primeira resposta,não relacionado ao WordPressporque é apenas PHP: use a lógica "ou" operador:
<?php if( current_user_can('editor') || current_user_can('administrator') ) { ?> // Stuff here for administrators or editors <?php } ?>
Se você quiser verificarmais de duasfunções,pode verificar se asfunções do usuário atualestão dentro de umamatriz defunções,algo como:
$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 } ?>
Noentanto,
current_user_can
pode ser usadonão apenas com os usuáriosnome dopapel,mastambém com capacidades.Então,uma vez que ambos oseditorese administradorespossameditarpáginas,sua vidapode serfacilmente verificandoesses recursos:
<?php if( current_user_can('edit_others_pages') ) { ?> // Stuff here for user roles that can edit pages: editors and administrators <?php } ?>
Dê uma olhada aqui Paramaisinformações sobre recursos.
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.
-
Vocêprecisa verificar se `is_logged_in ();`?do you need to check if `is_logged_in();` ?
- 1
- 2017-05-01
- RobBenz
-
@Robbenz Não,em qualquer um dos casos.Porque `Current_user_can ()` sempre retornafalse se o usuárionãoestiver logado,e `wp_get_current_user ()` retornará um usuário sem qualquerpapel se o usuárionãoestiver logado,então o 'array_intersect () será 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
-
No PHPDOC dafunção `Current_User_can (),podemos ver a linha" _Phile verificação contrapapéisespecíficosno lugar de uma capacidade é suportadaem parte,essaprática é desencorajada,poispodeproduzir resultadosnão confiáveis_ ".Entãoeu acho que seriamelhorevitar o uso defunções ao verificar a capacidade de um usuário :-)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
-
Quandoeu uso ométodo `Array_InterSect`,recebo um aviso PHPem nosso log deerros do servidor dizendo` array_intersect (): argumento # 2não é umamatriz '.Isso éporque o (s) usuário (es) é verificar apenas umafunção?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
-
@Garconis Normalmente,deve ser umamatriz.Por alguma razão,parece que vocênão é umamatriz.`array_intersect ($ Permitido_roles,(matriz) $ user->funções)` vaifuncionar semproblemas.@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
-
Eu aconselho contra a verificação depapéis ...e sim contra as capacidades.Émaisfácil remover ou adicionar uma capacidade a um conjunto depapéis ... émaisexplícito.`Current_user_can ('edit_orderform')` Porexemplo ... Talvez um salesRep seja capaz deeditar oformulário depedido ...masnãotem os direitos de adicionar conteúdo.A concessãoexplicitamente dessa capacidade é umaestrutura depermissõesmaisexplícitas do que opapel que um usuário é.Aspessoas usam vários chapéusem organizaçõesmaiores.Vocêpodeter assinantes quetêmmais acesso do que apenas ler.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
Primeiro,
current_user_can()
não deve ser usadopara verificar afunção de um usuário - deve ser usadopara verificar se um usuáriotem uma capacidadeespecífica .Em segundo lugar,em vez de sepreocupar com opapel do usuário,masem vez disso,concentrando-seem recursos,vocênãoprecisa sepreocuparem fazer coisas como oproblemaperguntounapergunta original (queestá verificando se o usuário é um administrador ou umeditor).Em vez disso,se
current_user_can()
estava sendo usado comopretendido,o que é verificar se há recursos de um usuário,não suafunção,vocênãoprecisaria do cheque condicionalpara conter um"ou" (||)teste.Porexemplo:if ( current_user_can( 'edit_pages' ) ) { ...
edit_pages é uma capacidade defunções administradore doeditor,masnão quaisquerpapéisinferiores,como autores.É assim que
current_user_can()
foi destinado a ser usado.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.-
** Porfavor,note **: Devs WP de altonível concordam comesta resposta.Você devetentarevitar a verificação dopapel,tanto quantopossível,use capabilés.Atualmenteestoutrabalhandoem umprojeto com váriospapéis que sótêm atampa "leitura".A única solução é afunção de verificaçãoparamim.Desculpe,não consigoencontrar o link,foi uma discussão abertano 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
-
Esta deve ser a resposta aceita,imo.`Current_user_can` devegeralmente ser usadopara recursos,nãofunções.This should be the accepted answer, IMO. `current_user_can` should generally be used for capabilities, not roles.
- 1
- 2019-05-13
- Armstrongest
-
+1paraisso,evite verificar asfunções via `current_user_can ()`.Se você quiser verificar asfunçõesportecla,execute uma verificação defunçãoem vez de uma verificação detampa :)+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 é afunção adequada,para verificar asfunções do usuárioexplicitamentee com segurança?Parece,é umpouco difícil descobrir que (seexistir).@Bjorn.What 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íntás Existem várias soluções válidasnestapágina.Mas use-os apenas se "Current_user_can ()"nãofor uma opção.Além disso,meu comentário émaisbaseadoem segurança.Porexemplo,se você quiser restringir o conteúdopara usuáriosespecíficos,namaioria dos casos,um cheque de capacidade é suficienteparaestatarefa.@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
Como @Butlerblog Responder declarado, vocênão deve usar o Current_user_canpara verificar contra umafunção
Este aviso é adicionadoespecificamentena documentação PHP de
Função HAS_CAP
que é chamadoporCurrent_user_can .
Ao verificar contra umpapelno lugar de uma capacidade é suportadoem parte,estaprática é desencorajada,poispodeproduzir resultadosnão confiáveis.
o maneira defazerisso é obter o usuárioe verificar o
.$ user->funções
,assim:se (! Function_Exists ('Current_User_has_role')) { função current_user_has_role ($função) { $ user=get_userdata (get_current_user_id ()); if (! USER USER||! $ user- >funções) { retornafalso; } if (is_array ($função)) { Retornar Array_INTERSECT ($função,(matriz) $ user->funções)? verdadeirofalso; } returnin_array ($função,(matriz) $ user->funções); } }
Aquiestão algumasfunções auxiliares queeu usoparafazerisso (como às vezeseunão quero apenas usuário atual):
se (! Function_Exists ('Current_User_has_role')) { função current_user_has_role ($função) { retorno user_has_role_by_user_id (get_current_user_id (),$função); } } if (!function_exists ('get_user_roles_by_user_id')) { funçãoget_user_roles_by_user_id ($ user_id) { $ User=get_userdata ($ user_id); Retornar vazio (USUÁRIO $)? array (): $ user- >funções; } } if (!function_exists ('user_has_role_by_user_id')) { função user_has_role_by_user_id ($ user_id,$função) { $ user_roles=get_user_roles_by_user_id ($ user_id); if (is_array ($função)) { retorno array_intersect ($função,$ user_roles)? verdadeirofalso; } Retornarin_array ($função,$ user_roles); } }
Então vocêpode simplesmentefazerisso:
currul_user_has_role ('editor');
ou
Current_user_has_role (matriz ('editor','administrador'));
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; ?>
-
Seria ótimo se vocêpudesseexplicar como ajuda op.It would be great if you could explain as how it helps OP.
- 1
- 2016-09-29
- bravokeyl
-
Vocêpodepermitir ver apágina apenas "editor" ou "membro" vocêpodepostareste código diretoem 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
-
Porfavor,não apenas cai código.Adicione comentáriose algumaexplicação comoisso resolve oproblema dos Ancers.Please don't just drop code. Add comments and some explanation how this solves the askers problem.
- 5
- 2016-09-29
- kraftner
-
Então sua resposta é a duplicação de códigopara cadafunção?So your answer is code duplication for each role?
- 0
- 2019-10-22
- Julix
-
- 2020-06-03
As respostas corretaspara a solução de solução acima são,pormaisprogramaçãobásica:
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: O administrador éencontrado,mas seempurrarmos o Editor,o administrador étãobem encontrado.Então,apenas deixamos o administradorpassare identificar oeditor apenas.
Lembre-se de que você deve sempre usareste códigopara chamarisso acimaparaminimizar o uso de código 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()){}
-
Isso éexatamente o que é declaradonapergunta ** **e o que o autornão quer.That is exactly what is stated in the **question**, and what the author doesn't want.
- 0
- 2020-06-03
- fuxia
-
Eu adicionei Resumopara quenãotenhamosmal-entendido.Foi difícil seguir as regrasmais que acredito.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
Comoposso verificar se o usuário logado atual é um administrador ou umeditor?
Eu sei comofazer cadaindividualmente:
Mas comoeutrabalho aquelesjuntos?I.e.,o usuário é um administrador oueditor?