จะตรวจสอบว่าผู้ใช้อยู่ในบทบาทที่เฉพาะเจาะจงได้อย่างไร?


59

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

ฉันกำลังมองหาฟังก์ชั่นที่ชอบ:

is_user_in_role($user, "author");

ฉันคิดว่ามันค่อนข้างง่าย แต่ฉันค้นหานานเกินไปโดยไม่มีคำตอบดังนั้นฉันคิดว่าฉันจะโพสต์ที่นี่

คำตอบ:


113

หากคุณต้องการสิ่งนี้สำหรับผู้ใช้ปัจจุบันcurrent_user_can()ยอมรับทั้งบทบาทและความสามารถ

UPDATE : การส่งผ่านชื่อบทบาทจะcurrent_user_can()ไม่รับประกันว่าจะทำงานได้อย่างถูกต้องอีกต่อไป (ดู# 22624 ) คุณอาจต้องการตรวจสอบบทบาทผู้ใช้แทน:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}

10
ฉันรู้ว่าโพสต์นี้ได้รับการตอบสนองมานานแล้ว แต่ถ้ามีคนมาที่นี่ ... ดูเอกสารอีกครั้งสำหรับ current_user_can () -> "อย่าส่งชื่อบทบาทไปที่ current_user_can () เพราะนี่ไม่รับประกันว่าจะ ทำงานอย่างถูกต้อง (ดู # 22624) แต่คุณอาจลองใช้ฟังก์ชั่นตรวจสอบบทบาทผู้ใช้ที่รวบรวมโดย AppThemes " ( codex.wordpress.org/Function_Reference/current_user_can )
bestprogrammerintheworld

1
^ มีวงเล็บที่ขาดหายไปในคำสั่ง if
Aajahid

1
@Aajahid แก้ไข :)
Rarst

10

ฉันกำลังมองหาวิธีที่จะได้รับบทบาทของผู้ใช้โดยใช้รหัสของผู้ใช้ นี่คือสิ่งที่ฉันมาด้วย:

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

จากนั้นis_user_in_role()ฟังก์ชั่นสามารถใช้งานได้เช่น:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}

1
ทำงานได้ดีสำหรับฉันเพื่อรับบทบาทแรกที่กำหนดให้กับผู้ใช้
Q Studio

บทบาททั้งหมดที่ได้รับมอบหมายให้กับผู้ใช้เป็นอย่างไร?
Vishal Kumar Sahu

1
@Vishal Kumar จะตรวจสอบกับบทบาททั้งหมดที่กำหนดให้กับผู้ใช้
Stephen M. Harris

ฟังก์ชั่นนี้ไม่มีอยู่ไม่แน่ใจว่ามันเก่าหรืออะไร แต่คุณควรใช้คำตอบด้านบนหรือคำตอบที่ฉันโพสต์ด้านล่าง
sMyles

2

คุณยังสามารถสร้างวัตถุผู้ใช้ใหม่:

$user = new WP_User( $user_id );

if ( ! empty( $user->roles ) && is_array( $user->roles ) && in_array( 'Some_role', $user->roles ) ) {
    return true;
}

ไม่แน่ใจว่ารุ่นใดget_user_roles_by_user_idถูกลบไป แต่ไม่มีฟังก์ชั่นที่ใช้งานได้อีกต่อไป


สิ่งนี้มีประโยชน์เมื่อฉันต้องเรียกวิธีการอื่นของคลาส WP_User
Justin Waulters

0

นี่คือฟังก์ชั่นที่ยอมรับผู้ใช้และบทบาทเพื่อความยืดหยุ่นที่มากขึ้น:

ฟังก์ชัน my_has_role (ผู้ใช้ $, $ role) {
  $ role = $ user-> role; 
  return in_array ($ role, (array) $ user-> role);
}

if (my_has_role (ผู้ใช้ $ 'some_role')) {
  // ทำสิ่งต่างๆ
}

0

การเรียกใช้บทบาทบน User Object $user->rolesไม่ได้ส่งคืนบทบาททั้งหมด วิธีที่ถูกต้องในการค้นหาว่าผู้ใช้มีบทบาทหรือความสามารถในการติดตาม (ใช้งานได้ใน wp เวอร์ชัน 2.0.0 และสูงกว่า) ฟังก์ชั่นต่อไปนี้ใช้งานได้กับ ID ผู้ใช้ที่คุณสามารถรับ ID ผู้ใช้ปัจจุบันได้$current_user_id = get_current_user_id();

/**
 * Returns true if a user_id has a given role or capability
 * 
 * @param int $user_id
 * @param string $role_or_cap Role or Capability
 * 
 * @return boolean
 */
function my_has_role($user_id, $role_or_cap) {

    $u = new \WP_User( $user_id );
    //$u->roles Wrong way to do it as in the accepted answer.
    $roles_and_caps = $u->get_role_caps(); //Correct way to do it as wp do multiple checks to fetch all roles

    if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true ) 
       {
           return true;
       }
 }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.