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

28 февр. 2011 г., 20:55:27
Просмотры: 16.3K
Голосов: 15

(Примечание модератора: Оригинальный заголовок был "Удалить администратора из меню пользователей")

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

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

0
Все ответы на вопрос 4
11
11

Привет @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) { // Если не администратор, убираем администратора
    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, попробуй этот вариант (так как хук '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) { // Если не администратор, убираем администратора
    global $wpdb;
    $user_search->query_where = str_replace('WHERE 1=1',
      "WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
  }
}
28 февр. 2011 г. 21:22:22
Комментарии

Это скрывает только первого добавленного пользователя (который почти всегда администратор)... но если администратор имеет ID, отличный от 1, вам нужно будет соответствующим образом изменить запрос. Также это скроет только одного администратора, а не всех.

EAMann EAMann
28 февр. 2011 г. 21:50:28

Мне удалось заставить это работать только в версии 3.1. Тот же код в более старых версиях, похоже, не работает (даже в 3.04).

Carlos Carlos
1 мар. 2011 г. 01:22:57

@EAMann - Верно, я поступил удобным образом. Если кому-то нужно больше, я разберусь.

MikeSchinkel MikeSchinkel
1 мар. 2011 г. 05:33:02

@Carlos - Тебе нужна версия 3.0.x или подойдет 3.1?

MikeSchinkel MikeSchinkel
1 мар. 2011 г. 05:33:21

@Mike—вау, да, если бы ты мог мне с этим помочь, было бы замечательно. Я уже долго бьюсь над этим безрезультатно. Для моих целей Admin ID 1 вполне подходит. Очень ценю твою помощь.

Carlos Carlos
1 мар. 2011 г. 09:20:10

@Carlos - Для уточнения: тебе нужна версия 3.0.x или что-то другое?

MikeSchinkel MikeSchinkel
1 мар. 2011 г. 19:42:50

@Carlos - Смотри мой обновлённый ответ.

MikeSchinkel MikeSchinkel
2 мар. 2011 г. 06:54:01

@Mike - Работает идеально. Большое спасибо за помощь.

Carlos Carlos
4 мар. 2011 г. 21:01:51

@Carlos - Рад, что смог помочь.

MikeSchinkel MikeSchinkel
4 мар. 2011 г. 21:57:21

Есть ли какой-нибудь плагин, который это делает?

ReNiSh AR ReNiSh AR
4 июн. 2014 г. 18:52:46

@ReNiShAR Возможно, но знание о существующих плагинах не входит в мою экспертизу. Я скорее знаю, как их создавать. :) Может, Google знает?

MikeSchinkel MikeSchinkel
7 июн. 2014 г. 06:20:50
Показать остальные 6 комментариев
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
        );

    }
}
7 февр. 2012 г. 04:12:38
Комментарии

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

Howdy_McGee Howdy_McGee
19 авг. 2013 г. 17:26:13
0

Уровни пользователей устарели, поэтому данный метод проверяет возможности вместо них:

/** Скрыть администратора из списка пользователей **/
function isa_pre_user_query( $user_search ) {
    if ( !current_user_can( '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' );
14 нояб. 2013 г. 19:44:56
2

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

4 мар. 2013 г. 20:28:38
Комментарии

Вы уверены? Можете указать источник? Это действие используется в текущей версии trunk - смотрите wp-includes/user.php, строка 549.

Johannes Pille Johannes Pille
27 сент. 2013 г. 12:48:20

wp_user_query не работает в версии 3.6.1, однако pre_user_query работает. Не знаю насчёт 3.5.x

gwillie gwillie
27 сент. 2013 г. 11:37:55