web-dev-qa-db-ja.com

管理者以下のロールに購読者のみの追加を許可する

Add_users/create_users機能をユーザータイプのグループ(編集者+カスタムロール)に与えたい。唯一の問題は、その機能を「加入者」タイプのユーザーのみを追加することに限定したいということであり、それ以上のものはありません。これを行う方法はありますか?

6
Tomas Buteler

これを実現するためのこの最初のステップは、特定の役割にcreate_usersの機能を追加することです。これを行うには、get_roleを呼び出してからadd_capメソッドを使用します。これは一度だけ行う必要があります。これはプラグインのアクティブ化でそれを行う例です。

<?php
register_activation_hook( __FILE__, 'wpse42003_activation' );
function wpse42003_activation()
{
    foreach( array( 'editor', 'your_custome_role' ) as $r )
    {
        $role = get_role( $r );
        if( $role )
            $role->add_cap( 'create_users' );
    }
}

あなたがそうするなら、おそらくあなたはremove_capを使ったプラグインの無効化の際にそれを元に戻すことを確かめたいと思うでしょう。

<?php
register_deactivation_hook( __FILE__, 'wpse42003_deactivation' );
function wpse42003_deactivation()
{
    foreach( array( 'editor', 'your_custome_role' ) as $r )
    {
        $role = get_role( $r );
        if( $role )
            $role->remove_cap( 'create_users' );
    }
}

今これらのユーザーが唯一の加入者を登録できることを確認することの問題。 user-new.phpページでは、ロールドロップダウンはwp_dropdown_rolesという名前の関数によって生成されます。この関数は現在のユーザーが編集または作成できるロールを取得するために関数get_editable_rolesを呼び出します。

幸いなことに、このビットを修正できるようにするフィルタがそこにあります。最初にすべての$roles配列キーをコピーしてから、ループして$rolesからsubscriber以外のすべてのロールを設定解除します - 現在のユーザーがロールエディタまたはカスタムロールを持っている場合のみです。

<?php
add_filter( 'editable_roles', 'wpse42003_filter_roles' );
function wpse42003_filter_roles( $roles )
{
    $user = wp_get_current_user();
    if( in_array( 'editor', $user->roles ) || in_array( 'your_custom_role', $user->roles ) )
    {
        $tmp = array_keys( $roles );
        foreach( $tmp as $r )
        {
            if( 'subscriber' == $r ) continue;
            unset( $roles[$r] );
        }
    }
    return $roles;
}

このボーナス部分は、ユーザーが追加または更新される前にget_editable_rolesが呼び出されることです - あなたの編集者は、JSなどでフォームに追加のオプションを挿入してユーザーを追加することはできません。

note:上の例のyour_custom_roleをあなたのロールの名前に変更してください。

すべて - プラグインとして

10
chrisguitarguy

@chrisguitarguyの答えはいいです。私は、マルチサイトインストールで顧客にサービスを提供する開発局から機能するように、コードを少し修正しました。私たちは「顧客」ユーザーロールを作成する必要がありましたが、もちろん顧客がそのドメインに別の顧客を追加することを許可されるべきではありません。私がこれに来た受け入れられた答えから修正:

/**
 * Add filter to ensure a Customer type can NOT create another Customer user
 */
add_filter( 'editable_roles', 'limit_create_user' );
function limit_create_user( $roles ){
    $user = wp_get_current_user();
    if( in_array( 'customer', $user->roles )){
        unset( $roles[ 'customer' ]);
    }
    return $roles;
}

誰かが将来これのための何らかの用途を見つけるかもしれないことを願っています。これはWP3.9.1でテストされ適用された。

1
rkeet