หากผู้ใช้ปัจจุบันเป็นผู้ดูแลระบบหรือบรรณาธิการ


101

ฉันจะตรวจสอบเพื่อดูว่าผู้ใช้ที่เข้าสู่ระบบในปัจจุบันเป็นผู้ดูแลระบบหรือบรรณาธิการได้อย่างไร?

ฉันรู้วิธีการทำทีละอย่าง:

<?php if(current_user_can('editor')) { ?> 
    <!-- Stuff here for editors -->
<?php } ?>

<?php if(current_user_can('administrator')) { ?>
    <!-- Stuff here for administrators -->
<?php } ?>

แต่ฉันจะทำงานร่วมกันได้อย่างไร เช่นผู้ใช้เป็นผู้ดูแลระบบหรือบรรณาธิการ?


10
if( current_user_can('editor') || current_user_can('administrator') )
Shazzad

คำตอบ:


190

คำตอบแรกไม่เกี่ยวข้องกับ WordPress เพราะมันเป็นเพียง PHP: ใช้ตัวดำเนินการตรรกะ "หรือ":

<?php if( current_user_can('editor') || current_user_can('administrator') ) {  ?>
    // Stuff here for administrators or editors
<?php } ?>

หากคุณต้องการตรวจสอบมากกว่าสองบทบาทคุณสามารถตรวจสอบว่าบทบาทของผู้ใช้ปัจจุบันอยู่ในบทบาทมากมายหรือไม่เช่น:

$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator', 'author');
<?php if( array_intersect($allowed_roles, $user->roles ) ) {  ?>
   // Stuff here for allowed roles
<?php } ?>

อย่างไรก็ตามcurrent_user_canสามารถใช้งานได้ไม่เฉพาะกับชื่อบทบาทของผู้ใช้ แต่ยังมีความสามารถ

ดังนั้นเมื่อทั้งผู้แก้ไขและผู้ดูแลระบบสามารถแก้ไขหน้าได้แล้วชีวิตของคุณสามารถตรวจสอบความสามารถเหล่านั้นได้ง่ายขึ้น:

<?php if( current_user_can('edit_others_pages') ) {  ?>
    // Stuff here for user roles that can edit pages: editors and administrators
<?php } ?>

ดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ


คุณจำเป็นต้องตรวจสอบis_logged_in();หรือไม่?
RobBenz

3
@ RobBenz ไม่ในกรณีใด ๆ เพราะcurrent_user_can()จะส่งกลับค่า false เสมอหากผู้ใช้ไม่ได้เข้าสู่ระบบและwp_get_current_user()จะส่งคืนผู้ใช้โดยไม่มีบทบาทใด ๆ หากผู้ใช้ไม่ได้เข้าสู่ระบบดังนั้นarray_intersect()จะเป็นเท็จเสมอ
gmazzap

1
ใน PHPDoc ของcurrent_user_can()ฟังก์ชั่นเราสามารถเห็นบรรทัด " ในขณะที่การตรวจสอบกับบทบาทเฉพาะในสถานที่ของความสามารถในการได้รับการสนับสนุนในส่วนการปฏิบัตินี้เป็นกำลังใจเพราะมันอาจให้ผลลัพธ์ที่ไม่น่าเชื่อถือ " ดังนั้นฉันคิดว่ามันจะดีกว่าถ้าจะหลีกเลี่ยงการใช้บทบาทในขณะที่ตรวจสอบความสามารถของผู้ใช้ :-)
Erenor Paz

เมื่อผมใช้array_intersectวิธีการที่ฉันได้รับการแจ้งเตือน PHP array_intersect(): Argument #2 is not an arrayในบันทึกข้อผิดพลาดเซิร์ฟเวอร์ของเราบอกว่า เป็นเพราะผู้ใช้ที่กำลังตรวจสอบมีเพียงบทบาทเดียวหรือไม่
Garconis

@Garconis โดยปกติควรเป็นอาร์เรย์ ด้วยเหตุผลบางอย่างดูเหมือนว่าคุณจะไม่ได้เป็นอาร์เรย์ array_intersect($allowed_roles, (array)$user->roles )จะทำงานโดยไม่มีปัญหา
gmazzap

9

ขั้นแรกcurrent_user_can()ไม่ควรใช้เพื่อตรวจสอบบทบาทของผู้ใช้ - ควรใช้เพื่อตรวจสอบว่าผู้ใช้มีความสามารถเฉพาะหรือไม่

ประการที่สองแทนที่จะเกี่ยวข้องกับบทบาทของผู้ใช้ แต่แทนที่จะมุ่งเน้นไปที่ความสามารถคุณไม่ต้องกังวลกับการทำสิ่งต่าง ๆ เช่นปัญหาที่ถามในคำถามเดิม (ซึ่งกำลังตรวจสอบว่าผู้ใช้เป็นผู้ดูแลระบบหรือบรรณาธิการ) หากcurrent_user_can()มีการใช้งานตามที่ควรจะเป็นการตรวจสอบความสามารถของผู้ใช้ไม่ใช่บทบาทของพวกเขาคุณไม่จำเป็นต้องตรวจสอบตามเงื่อนไขเพื่อให้มีการทดสอบ "หรือ" (||) ตัวอย่างเช่น:

if ( current_user_can( 'edit_pages' ) ) { ...

edit_pages เป็นความสามารถของทั้งผู้ดูแลระบบและบทบาทบรรณาธิการ แต่ไม่ได้มีบทบาทต่ำกว่าเช่นผู้เขียน นี่คือวิธีที่current_user_can()ตั้งใจจะใช้


โปรดทราบ : dev ระดับสูง WP เห็นด้วยกับคำตอบนี้ คุณควรพยายามหลีกเลี่ยงการตรวจสอบบทบาทให้มากที่สุดใช้ความสามารถ ขณะนี้ฉันกำลังทำงานในโครงการที่มีหลายบทบาทที่มีขีด จำกัด 'อ่าน' เท่านั้น ทางออกเดียวคือการตรวจสอบบทบาทของฉัน ขออภัยฉันหาลิงค์ไม่เจอมันเป็นการเปิดการสนทนาบน WP Github
Bjorn

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ IMO current_user_canโดยทั่วไปควรใช้ความสามารถไม่ใช่บทบาท
อาร์มสตรองที่

2

ตามที่ @butlerblog ระบุไว้คุณไม่ควรใช้ current_user_can เพื่อตรวจสอบกับบทบาท

การแจ้งเตือนนี้มีการเพิ่มโดยเฉพาะในเอกสาร PHP ของhas_capฟังก์ชันที่เรียกใช้โดยcurrent_user_can

ในขณะที่การตรวจสอบกับบทบาทแทนที่ความสามารถได้รับการสนับสนุนในส่วนการปฏิบัตินี้เป็นกำลังใจเพราะมันอาจให้ผลลัพธ์ที่ไม่น่าเชื่อถือ

ที่ถูกต้องวิธีที่จะทำเช่นนี้คือการได้รับใช้และตรวจสอบ$user->rolesเช่นนี้

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ) {

        $user = get_userdata( get_current_user_id() );
        if( ! $user || ! $user->roles ){
            return false;
        }

        if( is_array( $role ) ){
            return array_intersect( $role, (array) $user->roles ) ? true : false;
        }

        return in_array( $role, (array) $user->roles );
    }
}

นี่คือฟังก์ชั่นตัวช่วยที่ฉันใช้ในการทำสิ่งนี้ (บางครั้งฉันไม่ต้องการแค่ผู้ใช้ปัจจุบัน):

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ){
        return user_has_role_by_user_id( get_current_user_id(), $role );
    }
}

if( ! function_exists( 'get_user_roles_by_user_id' ) ){
    function get_user_roles_by_user_id( $user_id ) {
        $user = get_userdata( $user_id );
        return empty( $user ) ? array() : $user->roles;
    }
}

if( ! function_exists( 'user_has_role_by_user_id' ) ){
    function user_has_role_by_user_id( $user_id, $role ) {

        $user_roles = get_user_roles_by_user_id( $user_id );

        if( is_array( $role ) ){
            return array_intersect( $role, $user_roles ) ? true : false;
        }

        return in_array( $role, $user_roles );
    }
}

จากนั้นคุณสามารถทำสิ่งนี้:

current_user_has_role( 'editor' );

หรือ

current_user_has_role( array( 'editor', 'administrator' ) );


-1
<?php if( current_user_can('editor')) :
  echo "welcome";
elseif( current_user_can('member')) :
  echo "welcome";
else :
 wp_die("<h2>To view this page you must first <a href='". wp_login_url(get_permalink()) ."' title='Login'>log in</a></h2>");
endif;
?>

1
มันจะดีมากถ้าคุณสามารถอธิบายได้ว่ามันช่วย OP ได้อย่างไร
bravokeyl

คุณสามารถอนุญาตให้ดูหน้าเฉพาะ "ผู้แก้ไข" หรือ "สมาชิก" คุณสามารถโพสต์โค้ดนี้โดยตรงใน generic-page.php
seowmx

4
โปรดอย่าเพิ่งวางรหัส เพิ่มความคิดเห็นและคำอธิบายวิธีแก้ปัญหาของผู้ถาม
Kraftner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.