Удалить возможность для других пользователей просматривать администратора в списке пользователей?

15

( Примечание модератора: оригинальное название было «Удалить администратора из меню пользователя»)

Я создал роль администратора клиента, которая по сути является редактором с возможностью добавления / удаления пользователей. Статья « Редактор может создать любого нового пользователя, кроме администратора », отлично помогла мне отредактировать мою новую роль администратора клиента или создать истинного пользователя администратора.

Однако, что было бы идеально, это скрыть администраторов от администраторов клиентов, когда они просматривают пользователей. Я хочу, чтобы они «поверили», что они являются администраторами своего сайта, но я не хочу, чтобы они могли даже просматривать мою роль / пользователя - по сути, скрывая от них роль «администратор», когда они находятся в разделе «Пользователи». панель.

Carlos
источник

Ответы:

10

Привет @Carlos:

Попробуйте добавить следующее в functions.phpфайл вашей темы или в .phpфайл в плагине, который вы, возможно, пишете (который работает для WordPress 3.1.x):

add_action('pre_user_query','yoursite_pre_user_query');
function yoursite_pre_user_query($user_search) {
  $user = wp_get_current_user();
  if ($user->ID!=1) { // Is not administrator, remove administrator
    global $wpdb;
    $user_search->query_where = str_replace('WHERE 1=1',
      "WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
  }
}

Если у вас WordPress 3.0.x, попробуйте это вместо этого (поскольку WordPress не добавлял 'pre_user_query'хук до версии 3.1):

add_action('pre_user_search','yoursite_pre_user_search');
function yoursite_pre_user_search($user_search) {
  $user = wp_get_current_user();
  if ($user->ID!=1) { // Is not administrator, remove administrator
    global $wpdb;
    $user_search->query_where = str_replace('WHERE 1=1',
      "WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
  }
}
MikeSchinkel
источник
1
Это скрывает только первого добавленного пользователя (который почти всегда является администратором) ... но если у администратора есть идентификатор, отличный от 1, вам придется изменить запрос соответствующим образом. Также будет скрыт только 1 администратор, а не все администраторы.
EAMann
Я мог только заставить это работать на версии 3.1. Тот же код на любых старых версиях, похоже, не сработает (даже 3.04).
Карлос
@EAMann - Правда, мне было удобно. Если кому-то нужно больше, я посмотрю на это.
MikeSchinkel
@Carlos - Вам нужен v3.0.x или v3.1 хорошо?
MikeSchinkel
@ Майк - вау, да, если бы ты хотел помочь мне с этим, это было бы замечательно. Я взломал безрезультатно. Для моих целей Admin ID 1 работает просто отлично. Я очень ценю это.
Карлос
10

Вот мод на ответ MikeSchinkel, который проверяет, есть ли у текущего пользователя роль администратора, а если нет, то выбирает только пользователей, которые являются подписчиками.

add_action('pre_user_query','yoursite_pre_user_query');
function yoursite_pre_user_query($user_search) {
    $user = wp_get_current_user();

    if ( $user->roles[0] != 'administrator' ) { 
        global $wpdb;

        $user_search->query_where = 
        str_replace('WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.ID IN (
                 SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
                    WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}user_level' 
                    AND {$wpdb->usermeta}.meta_value = 0)", 
            $user_search->query_where
        );

    }
}
patnz
источник
1
Просто FYI Для тех , кто в будущем это не очень опытный в SQL , таких как я, если вы хотите , чтобы показать всех пользователей, которые не являются администраторами (редакторы, авторы, подписчиков и т.д.) , но по- прежнему скрывать администраторов, вы можете изменить эту строку: AND {$wpdb->usermeta}.meta_value = 0и вместо этого сделайте мета-значение <10 примерно так: AND {$wpdb->usermeta}.meta_value < 10)он покажет всех пользователей и скроет всех администраторов от всех пользователей независимо от их уровня.
Howdy_McGee
2

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

/** Hide Administrator From User List **/
function isa_pre_user_query( $user_search ) {
    if ( !current_user_can( 'administrator' ) ) { // Is Not Administrator - Remove Administrator
        global $wpdb;

        $user_search->query_where = str_replace(
            'WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.ID IN (
              SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
              WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}capabilities'
              AND {$wpdb->usermeta}.meta_value NOT LIKE '%administrator%' )", 
            $user_search->query_where
        );
    }
}

add_action( 'pre_user_query', 'isa_pre_user_query' );
Howdy_McGee
источник
1

pre_user_queryдействие может быть использовано для изменения пользовательского запроса, начиная с WordPress 3.1.0

Дева
источник
1
wp_user_queryне работает в 3.6.1, однако pre_user_queryработает. не знаю о 3.5.х
Гвилли
1
Ты уверен? Можете ли вы привести источник? Это действие используется в текущем транке - см. Wp-includes / user.php, строка 549 .
Йоханнес Пилле