Si el usuario actual es administrador o editor
-
-
`if (current_user_can ('editor')|| current_user_can ('administrador'))``if( current_user_can('editor') || current_user_can('administrator') )`
- 10
- 2014-01-30
- Shazzad
-
5 respuestas
- votos
-
- 2014-01-30
Primera respuesta,no relacionada con WordPressporquees solo PHP: useel operador lógico "O":
<?php if( current_user_can('editor') || current_user_can('administrator') ) { ?> // Stuff here for administrators or editors <?php } ?>
Si desea verificarmás de dos roles,puede verificar si los roles del usuario actualestán dentro de unamatriz de roles,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 } ?>
Sinembargo,
current_user_can
sepuede utilizarno solo con usuariosnombre del rol,perotambién con capacidades.Por lotanto,una vez quetanto loseditores como los administradorespuedaneditarpáginas,su vidapuede sermásfácil al verificaresas capacidades:
<?php if( current_user_can('edit_others_pages') ) { ?> // Stuff here for user roles that can edit pages: editors and administrators <?php } ?>
Eche un vistazo aquí para obtenermásinformación sobre las capacidades.
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.
-
¿necesita comprobar si `is_logged_in ();`?do you need to check if `is_logged_in();` ?
- 1
- 2017-05-01
- RobBenz
-
@RobBenzno,en ninguno de los casos.Porque `current_user_can ()` siempre devuelvefalso siel usuarionoestá conectado,y `wp_get_current_user ()` devolverá un usuario sinningún rol siel usuarionoestá conectado,por lo que `array_intersect ()` siempre seráfalso.@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
-
Enel PHPDoc de lafunción `current_user_can ()`,podemos ver la línea "_Sibien se admiteen parte la verificación contra rolesparticularesen lugar de una capacidad,estaprácticano se recomienda ya quepuedeproducir resultadospoco confiables_".Así que creo que seríamejorevitarel uso de rolesmientras se verifica la capacidad de un usuario :-)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
-
Cuando utilizoelmétodo `array_intersect`,aparece una advertencia de PHPen el registro deerrores denuestro servidor que dice` array_intersect (): Argument # 2isnot an array`.¿Se debe a que los usuarios queestá comprobando solotienen un rol?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 debería ser unamatriz.Por alguna razón,leparece quenoes unamatriz.`array_intersect ($ allowed_roles,(array) $ user-> roles)`funcionará sinproblemas.@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
-
Aconsejaríano verificar los roles ... ymásbien las capacidades.Esmásfácileliminar o agregar una capacidad a un conjunto de roles ...esmásexplícito.`current_user_can ('edit_orderform')`porejemplo ...tal vez un representante de ventas SOLAMENTE deberíapodereditarelformulario depedido ...peronotener los derechospara agregar contenido.Otorgarexplícitamenteesa capacidades unaestructura depermisosmásexplícita queel rol de un usuario.Lagente tienemúltiplesfuncionesen organizacionesmásgrandes.puedetener suscriptores quetenganmás acceso que solo leer.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
Primero,
current_user_can()
no debe usarsepara verificar lafunción de un usuario; debe usarsepara verificar si un usuariotiene una capacidad específica.En segundo lugar,en lugar depreocuparsepor lafunción del usuario y centrarseen las capacidades,notiene quemolestarseen hacer cosas comoelproblemaplanteadoen lapregunta original (quees verificar siel usuarioes un administrador O uneditor).En cambio,si
current_user_can()
seestaba usando según loprevisto,queespara verificar las capacidades de un usuario,no sufunción,nonecesitaría que la verificación condicional contenga una"o" (||)prueba.Porejemplo:if ( current_user_can( 'edit_pages' ) ) { ...
edit_pageses una capacidad de los roles de administrador yeditor,perono de rolesinferiores como los de autores.Asíes como sepretendía utilizar
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.-
** Tengaen cuenta **: Los desarrolladores de WP de altonivelestán de acuerdo conesta respuesta.Debeintentarevitar la verificación de rolestanto como seaposible,use capacidades.Actualmenteestoytrabajandoen unproyecto conmúltiples roles que solotienen el límite de 'lectura'.La única soluciónes la verificación de rolesparamí.Lo siento,nopuedoencontrarelenlace,fue una discusión abiertaen 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 debería ser la respuesta aceptada,en mi opinión.`current_user_can`generalmente debe usarsepara capacidades,no roles.This should be the accepted answer, IMO. `current_user_can` should generally be used for capabilities, not roles.
- 1
- 2019-05-13
- Armstrongest
-
+1 aesto,evite verificar roles através de `current_user_can ()`.Si desea verificar los rolespor clave,realice una verificación de rolesen lugar de una verificación de límites :)+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
-
Entonces,¿cuáles lafunción adecuadapara verificar los roles de los usuarios deformaexplícita y segura?Parece quees unpoco difícil deencontrar (siexiste).@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 Haymúltiples soluciones válidasen estapágina.Pero solo utilícelos si `current_user_can ()`noes una opción.Además,mi comentario sebasamásen la seguridad.Porejemplo,si desea restringirel contenidopara usuariosespecíficos,en lamayoría de los casos,una verificación de capacidades suficienteparaestatarea.@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
Comoindica la respuesta de @butlerblog,no debes usar current_user_canpara comparar unafunción
Este aviso se agregaespecíficamenteen la documentación PHP de lafunción
has_cap
quees llamadaporcurrent_user_can
Sibien se admiteen parte la verificación de un rolen lugar de una capacidad,estaprácticano se recomienda,ya quepuedeproducir resultadospoco confiables.
Laforma CORRECT de hacerestoes obtenerel usuario y verificarel
$user->roles
,así: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 ); } }
Aquí hay algunasfunciones auxiliares que utilizopara haceresto (ya que a vecesno quiero solo al usuario actual):
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 ); } }
Entoncespuedes haceresto:
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; ?>
-
Seríagenial sipudieraexplicar cómo ayuda a OP.It would be great if you could explain as how it helps OP.
- 1
- 2016-09-29
- bravokeyl
-
Puedepermitir ver lapágina solo "editor" o "miembro". Puedepublicareste código directamenteen 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,no se limite a dejarel código.Agregue comentarios y unaexplicación de cómoesto resuelveelproblema de los quepreguntan.Please don't just drop code. Add comments and some explanation how this solves the askers problem.
- 5
- 2016-09-29
- kraftner
-
Entonces,¿su respuestaes la duplicación de códigopara cadafunción?So your answer is code duplication for each role?
- 0
- 2019-10-22
- Julix
-
- 2020-06-03
Las respuestas correctas a lapregunta de solución anterior sonpor otra cosabásica deprogramación:
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: Seencuentrael administrador,pero sipresionamoseditor,también seencuentrael administrador.Así que dejamospasar al administradore identificamos solo aleditor.
Recuerde que siempre debe usareste códigopara llamar al anteriorparaminimizarel uso del código de la 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()){}
-
Esoesexactamente lo que se diceen la **pregunta ** y lo queel autorno quiere.That is exactly what is stated in the **question**, and what the author doesn't want.
- 0
- 2020-06-03
- fuxia
-
He añadidobrevespara quenotengamosningúnmalentendido.Creo quefue difícil seguir las demás reglas.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
¿Cómopuedo comprobar siel usuario que hainiciado sesión actualmentees un administrador o uneditor?
Sé cómo hacer cada unoindividualmente:
Pero,¿cómopuedo combinarlos?Es decir,¿el usuarioes administrador oeditor?