Если текущий пользователь является администратором или редактором
-
-
`if (current_user_can ('редактор')|| current_user_can ('администратор'))``if( current_user_can('editor') || current_user_can('administrator') )`
- 10
- 2014-01-30
- Shazzad
-
5 ответ
- голосов
-
- 2014-01-30
Первый ответ,не связанный с WordPress,потому что это всего лишь PHP: используйте логический оператор «ИЛИ»:
<?php if( current_user_can('editor') || current_user_can('administrator') ) { ?> // Stuff here for administrators or editors <?php } ?>
Если вы хотите проверить более двух ролей,вы можете проверить,находятся ли роли текущего пользователя внутри массива ролей,например:
$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 } ?>
Однако
current_user_can
можно использовать не только с пользователями имя роли,но также с возможностями.Итак,если и редакторы,и администраторы смогут редактировать страницы,ваша жизнь станет проще проверять эти возможности:
<?php if( current_user_can('edit_others_pages') ) { ?> // Stuff here for user roles that can edit pages: editors and administrators <?php } ?>
Дополнительную информацию о возможностях см. здесь .
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.
-
вам нужно проверить,есть ли `is_logged_in ();`?do you need to check if `is_logged_in();` ?
- 1
- 2017-05-01
- RobBenz
-
@RobBenz нет,ни в коем случае.Поскольку current_user_can () всегда возвращаетfalse,если пользователь не вошел в систему,а wp_get_current_user () вернет пользователя без какой-либо роли,если пользователь не вошел в систему,поэтому array_intersect () всегда будет ложным.@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
-
В PHPDoc функции `current_user_can ()` мы можем увидеть строку «_Хотя проверка конкретных ролей вместо возможности частично поддерживается,такая практика не приветствуется,поскольку может дать ненадежные результаты_».Поэтому я думаю,что было бы лучше избегать использования ролей при проверке возможностей пользователя :-)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
-
Когда я использую метод array_intersect,я получаю предупреждение PHP в нашем журнале ошибок сервера,в котором говорится,что array_intersect (): аргумент № 2 не является массивом.Это потому,что проверяемые пользователи имеют только одну роль?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 обычно должен быть массивом.Почему-то вам кажется,что это не массив.`array_intersect ($ allowed_roles,(array) $ user-> roles)` будет работать без проблем.@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
-
Я бы не советовал проверять по ролям ... а скорее по возможностям.Легче удалить или добавить возможность к набору ролей ... это более явно.Например,`current_user_can ('edit_orderform')` ... возможно,торговый представитель должен ТОЛЬКО иметь возможность редактировать форму заказа ... но не иметь прав на добавление содержимого.Явное предоставление этой возможности представляет собой более явную структуру разрешений,чем роль пользователя.В крупных организациях люди носят разные шляпы.у вас могут быть подписчики,у которых будет больше доступа,чем просто чтение.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
Во-первых,
current_user_can()
не следует использовать для проверки роли пользователя - его следует использовать для проверки наличия у пользователя определенных возможностей .Во-вторых,вместо того,чтобы беспокоиться о роли пользователя,а вместо этого сосредоточиться на возможностях,вам не нужно беспокоиться о таких вещах,как проблема,заданная в исходном вопросе (который проверяет,является ли пользователь администратором ИЛИредактор).Вместо этого,если
current_user_can()
использовался по назначению,то есть для проверки возможностей пользователя,а не его роли,вам не нужно,чтобы условная проверка содержала"или" (||) тест.Например:if ( current_user_can( 'edit_pages' ) ) { ...
edit_pages - это возможность ролей администратора и редактора,но не более низких ролей,таких как авторы.Именно так должен был использоваться
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.-
** Обратите внимание **: разработчики WP высокого уровня согласны с этим ответом.Вам следует по возможности избегать проверки ролей,использовать возможности.В настоящее время я работаю над проектом с несколькими ролями,у которых есть только ограничение на чтение.Единственное решение для меня - проверка ролей.Извините,я не могу найти ссылку,это была открытая дискуссия на 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
-
Это должен быть принятый ответ,ИМО.current_user_can обычно следует использовать для возможностей,а не для ролей.This should be the accepted answer, IMO. `current_user_can` should generally be used for capabilities, not roles.
- 1
- 2019-05-13
- Armstrongest
-
+1 к этому,избегайте проверки ролей через `current_user_can ()`.Если вы хотите проверять роли по ключу,то выполняйте проверку роли вместо проверки ограничения :)+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
-
Какова же тогда правильная функция для явной и безопасной проверки ролей пользователей?Кажется,это немного сложно найти (если есть).@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 На этой странице есть несколько подходящих решений.Но используйте их только в том случае,если `current_user_can ()` не подходит.Кроме того,мой комментарий больше основан на безопасности.Например,если вы хотите ограничить контент для определенных пользователей,в большинстве случаев для этой задачи достаточно проверки возможностей.@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
Как указано в ответе @butlerblog, вам не следует использовать current_user_can для проверки роли
Это примечание специально добавлено в документацию PHP для функции
<цитата>has_cap
,которая вызываетсяcurrent_user_can
Хотя проверка роли вместо возможности частично поддерживается,такая практика не рекомендуется,поскольку она может привести к ненадежным результатам.
CORRECT способ сделать это - получить пользователя и проверить роли
$user->roles
,например: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 ); } }
Вот несколько вспомогательных функций,которые я использую для этого (иногда мне нужен не только текущий пользователь):
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 ); } }
Тогда вы можете просто сделать это:
current_user_has_role( 'editor' );
или
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; ?>
-
Было бы здорово,если бы вы могли объяснить,как это помогает OP.It would be great if you could explain as how it helps OP.
- 1
- 2016-09-29
- bravokeyl
-
Вы можете разрешить просмотр страницы только «редактору» или «члену»,вы можете разместить этот код прямо в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
-
Пожалуйста,не бросайте код.Добавьте комментарии и объясните,как это решает проблему спрашивающих.Please don't just drop code. Add comments and some explanation how this solves the askers problem.
- 5
- 2016-09-29
- kraftner
-
Итак,ваш ответ - дублирование кода для каждой роли?So your answer is code duplication for each role?
- 0
- 2019-10-22
- Julix
-
- 2020-06-03
Правильные ответы на вышеупомянутый вопрос решения даны с помощью базового программированияelse:
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 --> }}
Кратко: администратор найден,но если мы нажимаем на редактор,администратор также найден.Поэтому мы просто позволяем администратору пройти и идентифицировать только редактора.
Помните,что вы всегда должны использовать этот код для вызова этого выше,чтобы минимизировать использование кода процессора:
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()){}
-
Это именно то,что сказано в ** вопросе **,и чего автор не хочет.That is exactly what is stated in the **question**, and what the author doesn't want.
- 0
- 2020-06-03
- fuxia
-
Я добавил бриф,чтобы у нас не было недоразумений.Я считаю,что было трудно следовать другим правилам.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
Как я могу проверить,является ли текущий вошедший в систему пользователь администратором или редактором?
Я умею делать каждого индивидуально:
Но как мне объединить их вместе?Т.е. пользователь является администратором или редактором?