Add_users/create_users機能をユーザータイプのグループ(編集者+カスタムロール)に与えたい。唯一の問題は、その機能を「加入者」タイプのユーザーのみを追加することに限定したいということであり、それ以上のものはありません。これを行う方法はありますか?
これを実現するためのこの最初のステップは、特定の役割に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
をあなたのロールの名前に変更してください。
すべて - プラグインとして 。
@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でテストされ適用された。