私のサイトには3つの追加の役割があります。
これらの役割は次のコードで追加されます。
* adding Doctor role */
$doctor_role = add_role('Doctor', __('Doctor'), array('read'=>'true'));
/* adding Receptionist role */
$receptionist_role = add_role('Receptionist', __('Receptionist'), array('read'=>'true'));
/* adding Guest role */
$guest_role = add_role('Guest', __('Guest'), array('read'=>'true'));
デフォルトでAdministrator
ロールは他のすべてのロールを作成します。しかし、私はこの割り当ての役割をユーザーレベルで制限したいと思います。つまり、
Receptionist
とGuest
のロールユーザーを作成できるはずですONLYGuest
ロールユーザーを作成できるはずですONLYどうすればこれができますか?私がプラグインを使わずにこれを達成することができればもっと良いです。
まず、Doctor
およびReceptionist
ロールに次の機能を追加する必要があります。
list_users
edit_users
create_users
delete_users
これで、 which ユーザーが/ edite/deleteを作成できるようになりました。ユーザーがどのロールを編集することを許可されているかを返す「ヘルパー」関数から始めましょう:
/**
* Helper function get getting roles that the user is allowed to create/edit/delete.
*
* @param WP_User $user
* @return array
*/
function wpse_188863_get_allowed_roles( $user ) {
$allowed = array();
if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles
$allowed = array_keys( $GLOBALS['wp_roles']->roles );
} elseif ( in_array( 'Doctor', $user->roles ) ) {
$allowed[] = 'Receptionist';
$allowed[] = 'Guest';
} elseif ( in_array( 'Receptionist', $user->roles ) ) {
$allowed[] = 'Guest';
}
return $allowed;
}
また、ユーザーに割り当てることができる役割を設定するには
/**
* Remove roles that are not allowed for the current user role.
*/
function wpse_188863_editable_roles( $roles ) {
if ( $user = wp_get_current_user() ) {
$allowed = wpse_188863_get_allowed_roles( $user );
foreach ( $roles as $role => $caps ) {
if ( ! in_array( $role, $allowed ) )
unset( $roles[ $role ] );
}
}
return $roles;
}
add_filter( 'editable_roles', 'wpse_188863_editable_roles' );
そして最後に、自分の役割に基づいて編集/削除できるユーザーを制限します。
/**
* Prevent users deleting/editing users with a role outside their allowance.
*/
function wpse_188863_map_meta_cap( $caps, $cap, $user_ID, $args ) {
if ( ( $cap === 'edit_user' || $cap === 'delete_user' ) && $args ) {
$the_user = get_userdata( $user_ID ); // The user performing the task
$user = get_userdata( $args[0] ); // The user being edited/deleted
if ( $the_user && $user && $the_user->ID != $user->ID /* User can always edit self */ ) {
$allowed = wpse_188863_get_allowed_roles( $the_user );
if ( array_diff( $user->roles, $allowed ) ) {
// Target user has roles outside of our limits
$caps[] = 'not_allowed';
}
}
}
return $caps;
}
add_filter( 'map_meta_cap', 'wpse_188863_map_meta_cap', 10, 4 );
上記の答えはうまくいきました。ただし、役割は小文字にする必要があります。
function wpse_188863_get_allowed_roles( $user ) { }
例えば:
if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles
$allowed = array_keys( $GLOBALS['wp_roles']->roles );
} elseif ( in_array( 'doctor', $user->roles ) ) {
$allowed[] = 'receptionist';
$allowed[] = 'guest';
} elseif ( in_array( 'receptionist', $user->roles ) ) {
$allowed[] = 'guest';
}