ตามที่ @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' ) );
if( current_user_can('editor') || current_user_can('administrator') )