ユーザーロールが、自分のレベルよりも低いロールのみで新しいユーザーを作成できるようにする方法は?


14

私のサイトには3つの追加の役割があります。

  1. 医師
  2. 受付
  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、他のすべてのロールを作成します。ただし、この割り当てロールをユーザーレベルで制限したいと思います。私が意味するのは:

  1. 管理者-すべての役割ユーザーを作成できる必要があります-デフォルトで可能です。
  2. 医師- ユーザーのみを作成ReceptionistおよびGuestロールできる必要があります
  3. 受付係- Guest役割ユーザーのみを作成できる必要があります
  4. ゲスト- ユーザーの作成は許可されていません

どうすればこれができますか?プラグインを使用せずにこれを達成できればより良い。

回答:


23

まず、次の機能をDoctorand Receptionistロールに追加する必要があります。

  • list_users
  • edit_users
  • create_users
  • delete_users

今、私たちは制御で動作するように取得することができ彼らは/ edite /削除作成できるユーザー。ユーザーが編集できるロールを返す「ヘルパー」機能から始めましょう。

/**
 * 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 );

本当にありがとうございます。機能とコードを追加した後、期待どおりに機能します。しかしDoctorsReceptionistそしてGuest、あまりにも自分のプロファイルを編集することはできません。自分のプロファイルを編集してほしい。どうやってやるの?
リファズスター

こんにちはTheDeadMedic ..そこにいますか?私はあなたの答えを支持しました。上記のコメントを見ていただけますか?
リファズスター

リビジョンを確認してください。
TheDeadMedic

@TheDeadMedicあなたのコードは私を大いに助けてくれました。トラブルは1つしかありません。これをマルチサイトで使用します。そして、このコードは私の問題を解決しましたが、別の問題を作成しました。スーパー管理者としてログインすると、スーパー管理者のネットワークページからロールを選択できません。これをどうやって解決しますか?
jockebq

1
これは質問に対する素晴らしい回答です。この分野では、Wordpressのドキュメントが完全に欠けており、文法上の誤りがいっぱいであることがわかりました。これは、問題に対する本当に効率的な解決策です。
ベンジー

0

上記の答えはうまくいきました。ただし、ロールは小文字にする必要があります

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';
}

ほとんどの場合、ロールのケースは小文字である必要があります。上記の例では、スラッグと名前の両方がタイトルケースを使用して指定されているため、これは技術的には正しいですが、推奨されません。
ベンジー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.