Xóa khả năng cho người dùng khác xem quản trị viên trong danh sách người dùng?


15

( Lưu ý của người điều hành: Tiêu đề gốc là "Xóa quản trị viên khỏi menu người dùng")

Tôi đã tạo một vai trò quản trị viên khách hàng, về cơ bản là Trình chỉnh sửa có khả năng thêm / xóa người dùng. Bài viết " Trình chỉnh sửa có thể tạo bất kỳ người dùng mới nào ngoại trừ quản trị viên " rất xuất sắc trong việc giúp giữ vai trò quản trị viên khách hàng mới của tôi không chỉnh sửa hoặc tạo người dùng quản trị viên thực thụ.

Tuy nhiên, điều lý tưởng là ẩn các quản trị viên khỏi quản trị viên khách hàng khi họ đang xem người dùng. Tôi muốn họ "tin" rằng họ là quản trị viên của trang của họ nhưng tôi không muốn họ thậm chí có thể xem vai trò / người dùng của tôi - về cơ bản là ẩn vai trò "quản trị viên" khỏi họ khi họ ở trong "Người dùng" bảng điều khiển.

Câu trả lời:


10

Xin chào @Carlos:

Hãy thử thêm phần sau vào functions.phptệp của chủ đề hoặc trong .phptệp trong plugin mà bạn có thể đang viết (hoạt động cho 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);
  }
}

Nếu bạn có WordPress 3.0.x, hãy thử điều này thay vào đó (vì WordPress đã không thêm 'pre_user_query'hook cho đến 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
Điều đó chỉ ẩn người dùng đầu tiên được thêm vào (gần như luôn luôn là quản trị viên) ... nhưng nếu quản trị viên có ID khác 1, bạn sẽ phải thay đổi truy vấn một cách thích hợp. Nó cũng sẽ chỉ ẩn 1 quản trị viên, không phải tất cả quản trị viên.
EAMann

Tôi thực sự chỉ có thể làm cho nó hoạt động trên phiên bản 3.1. Cùng một mã trên bất kỳ phiên bản cũ nào dường như không thực hiện được mẹo (3.04 chẵn).
Carlos

@EAMann - Đúng vậy, tôi đã được thuận tiện. Nếu ai đó cần thêm tôi sẽ xem xét nó.
MikeSchinkel

@Carlos - Bạn cần v3.0.x, hay v3.1 có ổn không?
MikeSchinkel

@ Mike, wow, vâng, nếu bạn sẵn sàng giúp tôi với điều đó thì thật tuyệt vời. Tôi đã bị hack đi vô ích. Đối với mục đích của tôi, Admin ID 1 hoạt động tốt. Tôi rất trân trọng điều này.
Carlos

10

Đây là bản sửa đổi cho câu trả lời của MikeSchinkel để kiểm tra xem người dùng hiện tại có vai trò quản trị viên hay không và nếu không thì chỉ chọn người dùng là người đăng ký.

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
Chỉ cần FYI Đối với bất kỳ ai trong tương lai không thành thạo SQL như tôi, nếu bạn muốn cho tất cả người dùng không phải là quản trị viên (Biên tập viên, Tác giả, Người đăng ký, v.v.) nhưng vẫn ẩn quản trị viên, bạn có thể thay đổi dòng này: AND {$wpdb->usermeta}.meta_value = 0và thay vào đó, hãy tạo giá trị meta <10 như vậy: AND {$wpdb->usermeta}.meta_value < 10)sẽ hiển thị tất cả người dùng và ẩn tất cả quản trị viên khỏi tất cả người dùng cho dù cấp độ của họ là bao nhiêu.
Howdy_McGee

2

Cấp độ người dùng không được dùng nữa , vì vậy phương pháp này kiểm tra các khả năng thay thế:

/** 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_queryhành động có thể được sử dụng để thay đổi truy vấn của người dùng kể từ WordPress 3.1.0


1
wp_user_querykhông hoạt động trong 3.6.1, tuy nhiên pre_user_query. không biết về 3.5.x
gwillie

1
Bạn chắc chứ? Bạn có thể trích dẫn một nguồn? Hành động này được sử dụng trong trung kế hiện tại - xem wp-gồm / user.php, dòng 549 .
Julian Pille
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.