Якщо поточний користувач - адміністратор або редактор


100

Як я можу перевірити, чи є поточний користувач, який увійшов у систему, є адміністратором чи редактором?

Я знаю, як робити кожен окремо:

<?php if(current_user_can('editor')) { ?> 
    <!-- Stuff here for editors -->
<?php } ?>

<?php if(current_user_can('administrator')) { ?>
    <!-- Stuff here for administrators -->
<?php } ?>

Але як я працюю з ними разом? Тобто, користувач є адміністратором чи редактором?


10
if( current_user_can('editor') || current_user_can('administrator') )
Шаццад

Відповіді:


189

Перша відповідь, не пов'язана з 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 } ?>

Подивіться тут, щоб отримати додаткові відомості про можливості.


чи потрібно перевірити, чи is_logged_in();?
RobBenz

3
@RobBenz ні, в жодному з випадків. Тому що current_user_can()завжди повертається помилковим, якщо користувач не входить у систему, і wp_get_current_user()повертає користувача без будь-якої ролі, якщо користувач не входить у систему, тож array_intersect()завжди буде помилковим.
gmazzap

1
У PHPDoc current_user_can()функції ми можемо побачити рядок " Хоча частково підтримується перевірка відповідності певним ролям замість можливостей, ця практика відбивається, оскільки це може призвести до ненадійних результатів ". Тому я думаю, що було б краще уникати використання ролей під час перевірки можливостей користувача :-)
Erenor Paz,

Коли я використовую array_intersectметод, я отримую попередження PHP у нашому сервері журналу помилок array_intersect(): Argument #2 is not an array. Це тому, що користувач (и) перевіряють лише одну роль?
Гарконіс

@Garconis зазвичай це має бути масив. Чомусь вам здається, що це не масив. array_intersect($allowed_roles, (array)$user->roles )працюватиме без проблем.
gmazzap

9

По-перше, current_user_can()не слід використовувати для перевірки ролі користувача - його слід перевірити, чи є у користувача певні можливості .

По-друге, замість того, щоб перейматися роллю користувача, а замість того, щоб зосереджуватись на можливостях, вам не доведеться заважати виконувати такі дії, як проблема, про яку задається в первісному запитанні (яка перевіряє, чи користувач адміністратор чи редактор). Натомість, якщо ви current_user_can()використовувались за призначенням, що полягає у перевірці можливостей користувача, а не їх ролі, вам не знадобиться умовна перевірка, щоб містити тест "чи" (||). Наприклад:

if ( current_user_can( 'edit_pages' ) ) { ...

edit_pages є функцією як адміністраторської, так і редакторної ролей, але не будь-яких нижчих ролей, таких як автори. Ось як current_user_can()передбачалося використовувати.


Будь ласка, зверніть увагу : розробники WP високого рівня згодні з цією відповіддю Ви повинні намагатися максимально уникати перевірки ролей, користуватися можливостями. Зараз я працюю над проектом з декількома ролями, у яких є лише обмеження для читання. Єдине рішення - це перевірка ролей для мене. На жаль, я не можу знайти посилання, це було відкрите обговорення на WP Github.
Бьорн

Це має бути прийнята відповідь, ІМО. current_user_canзазвичай слід використовувати для можливостей, а не для ролей.
Армстронджест

2

Як зазначено у відповіді @butlerblog, вам не слід використовувати current_user_can для перевірки ролі

Це повідомлення спеціально додається в документацію PHP про has_capфункцію, яку викликаєcurrent_user_can

Незважаючи на те, що частково підтримується перевірка проти ролі замість можливостей, ця практика відмовляється, оскільки вона може призвести до ненадійних результатів.

ПРАВИЛЬНИЙ спосіб зробити це , щоб змусити користувача і перевірити $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' ) );


-1
<?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;
?>

1
Було б чудово, якби ви могли пояснити, як це допомагає ОП.
bravokeyl

Ви можете дозволити бачити сторінку лише "редактора" або "члена", ви можете розмістити цей код прямо в generic-page.php
seowmx

4
Будь ласка, не просто киньте код. Додайте коментарі та пояснення, як це вирішує проблему запитувачів.
kraftner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.