ลบความสามารถสำหรับผู้ใช้รายอื่นเพื่อดูผู้ดูแลระบบในรายการผู้ใช้หรือไม่


15

( หมายเหตุของผู้ดำเนินรายการ:ชื่อดั้งเดิมคือ "ลบผู้ดูแลออกจากเมนูผู้ใช้")

ฉันได้สร้างบทบาทผู้ดูแลระบบไคลเอนต์ซึ่งเป็นเครื่องมือแก้ไขที่มีความสามารถในการเพิ่ม / ลบผู้ใช้ บทความ" Editor สามารถสร้างผู้ใช้ใหม่ยกเว้นผู้ดูแลระบบ "เป็นเลิศในการช่วยให้บทบาทผู้ดูแลระบบไคลเอนต์ใหม่ของฉันไม่สามารถแก้ไขหรือสร้างผู้ใช้ True admin

อย่างไรก็ตามสิ่งที่เหมาะสมที่สุดคือการซ่อนผู้ดูแลระบบจากผู้ดูแลระบบของลูกค้าเมื่อพวกเขาดูผู้ใช้ ฉันต้องการให้พวกเขา"เชื่อ"ว่าพวกเขาเป็นผู้ดูแลเว็บไซต์ของพวกเขา แต่ฉันไม่ต้องการให้พวกเขาสามารถดูบทบาท / ผู้ใช้ของฉันได้โดยการซ่อนบทบาท"ผู้ดูแลระบบ"จากพวกเขาเมื่อพวกเขาอยู่ใน"ผู้ใช้"แผงหน้าปัด.

คำตอบ:


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'hook จนถึง 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
นั่นจะซ่อนเฉพาะผู้ใช้คนแรกที่เพิ่ม (ซึ่งเกือบจะเป็นผู้ดูแลระบบเสมอ) ... แต่ถ้าผู้ดูแลระบบมี ID อื่นที่ไม่ใช่ 1 คุณจะต้องเปลี่ยนแบบสอบถามอย่างเหมาะสม มันจะซ่อนเพียง 1 ผู้ดูแลระบบไม่ใช่ผู้ดูแลระบบทั้งหมด
EAMann

ที่จริงฉันสามารถทำให้มันใช้งานได้กับเวอร์ชัน 3.1 เท่านั้น รหัสเดียวกันในเวอร์ชั่นเก่า ๆ นั้นดูเหมือนจะไม่ใช้เล่ห์เหลี่ยม (3.04 เท่ากัน)
Carlos

@EAMann - จริงฉันสะดวก หากมีคนต้องการมากกว่านี้ฉันจะพิจารณามัน
MikeSchinkel

@Carlos - คุณต้องการ v3.0.x หรือไม่ v3.1 เป็นไร
MikeSchinkel

@ Mike - ว้าวใช่แล้วถ้าคุณยินดีที่จะช่วยฉันด้วยมันจะยอดเยี่ยม ฉันแฮ็คไปแล้วไม่มีประโยชน์ สำหรับจุดประสงค์ของฉัน ID ผู้ดูแลระบบ 1 ใช้งานได้ดี ฉันซาบซึ้งจริงๆ
Carlos

10

นี่คือ mod ของคำตอบของ 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-includes / user.php สาย 549
Johannes Pille
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.