Как скрыть администратора из списка пользователей для других ролей?
(Примечание модератора: Оригинальный заголовок был "Удалить администратора из меню пользователей")
Я создал роль клиентского администратора, которая по сути является редактором с возможностью добавлять/удалять пользователей. Статья "Редактор может создавать любых новых пользователей, кроме администратора" отлично помогла ограничить мою новую роль клиентского администратора от редактирования или создания настоящего администратора.
Однако идеальным было бы скрыть администраторов от клиентских администраторов при просмотре списка пользователей. Я хочу, чтобы они "верили", что являются администраторами своего сайта, но не хочу, чтобы они могли даже видеть мою роль/пользователя — по сути, скрыть роль "администратора" от них, когда они находятся в панели "Пользователи".

Привет @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);
}
}

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

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

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

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

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

Вот модификация ответа 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
);
}
}

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

Уровни пользователей устарели, поэтому данный метод проверяет возможности вместо них:
/** Скрыть администратора из списка пользователей **/
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' );

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