Как узнать, текущий пользователь админ или редактор?

Как я могу проверить, является ли текущий пользователь администратором или редактором?

Я знаю, как это сделать по отдельности:

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

Но как мне объединить это? Как узнать, админ это или редактор?

Понравился вопрос? Нужен ответ? Поддержите проект
WPAsk
Ответов: 10
  1. butlerblog

    Во-первых, current_user_can() не следует использовать для проверки роли пользователя — его следует использовать для проверки, имеет ли пользователь определенные права.

    Во-вторых, вместо того, чтобы определять роль пользователя, вам нужно знать его права. Вместо этого, если current_user_can() использовался по назначению, то есть для проверки прав пользователя, а не его роли, вам не понадобится условная проверка, содержащая тест «или» (||). Например:

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

    edit_pages это функция администраторов и редакторов, но не нижестоящих ролей, таких как авторы. Вот как current_user_can() должна использоваться.

  2. seowmx
    <?php if( current_user_can('editor')) :
      echo "welcome";
    elseif( current_user_can('member')) :
      echo "welcome";
    else :
     wp_die("<h2>Для просмотра этой страницы вы должны сначала <a href='". wp_login_url(get_permalink()) ."' title='Login'>log in</a></h2>");
    endif;
    ?>
    
    1. seowmx

      Вы можете разрешить видеть на странице только «редактора» или «участника», вы можете разместить этот код прямо в generic-page.php

  3. gmazzap

    Первый ответ, не связанный с WordPress, потому что это всего лишь PHP, используйте логический оператор «ИЛИ»:

    <?php if( current_user_can('editor') || current_user_can('administrator') ) {  ?> 
        // для администраторов или редакторов
    <?php } ?>
    

    Если нужно проверить более двух ролей, вы можете проверить, находятся ли роли текущего пользователя в массиве ролей, что-то вроде:

    $user = wp_get_current_user();
    $allowed_roles = array('editor', 'administrator', 'author');
    <?php if( array_intersect($allowed_roles, $user->roles ) ) {  ?> 
       //для разрешенных ролей
    <?php } ?>
    

    Однако, current_user_can можно использовать не только с именем роли пользователя, но и с разрешениями. Поэтому:

    <?php if( current_user_can('edit_others_pages') ) {  ?> 
        // для ролей пользователей, которые могут редактировать страницы: редакторы и администраторы
    <?php } ?>
    
    1. Erenor Paz

      Согласно PHPDoc, в описании функции current_user_can(), мы можем видеть строку «Хотя проверка по отдельным ролям вместо возможности поддерживается частично, эта практика не рекомендуется, так как она может привести к ненадежным результатам». Поэтому я думаю, что было бы лучше избегать использования ролей при проверке возможностей пользователя :-)

    2. gmazzap♦

      Поскольку current_user_can() всегда возвращает false, если пользователь не вошел в систему, а wp_get_current_user() вернет пользователя без какой-либо роли, если пользователь не вошел в систему, поэтому array_intersect() всегда будет выдавать false.

    3. RobBenz

      Вам нужно проверить, если is_logged_in(); ?

    4. Garconis

      Когда я использую метод array_intersect, я получаю предупреждение PHP в журнале ошибок сервера о том, что array_intersect(): Argument #2 не является массивом. Это потому, что проверяемые пользователи имеют только одну роль?

    5. gmazzap♦

      Обычно это должен быть массив. По какой-то причине вам кажется, что это не так. array_intersect($allowed_roles, (array)$user->roles ) будет работать без проблем.

  4. Shazzad

    if( current_user_can('editor') || current_user_can('administrator') )

Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: