Видалити можливість інших користувачів переглядати адміністратора в списку користувачів?


15

( Примітка модератора: Оригінальна назва була "Видалити адміністратора з меню користувача")

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

Однак, що було б ідеально - приховати адміністраторів від адміністраторів клієнтів, коли вони переглядають користувачів. Я хочу, щоб вони "вірили", що вони є адміністратором свого сайту, але я не хочу, щоб вони могли навіть бачити мою роль / користувача - по суті, ховаючи від них роль "адміністратора", коли вони перебувають у "Користувачі" панель.

Відповіді:


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);
  }
}

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
        );

    }
}

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' );

1

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


1
wp_user_queryне працює в 3.6.1, однак pre_user_queryце робить. не знаю про 3.5.x
gwillie

1
Ви впевнені? Чи можете ви навести джерело? Ця дія використовується в поточному магістралі - див. Wp-include / user.php, рядок 549 .
Йоганнес Піл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.