web-dev-qa-db-ja.com

ロールセレクタをフィルタする方法

WordPressのロールは階層的ではないことを私は知っていますが、「ユーザーをロールに割り当てる」ような機能があるのではないかと思います。ユーザーを追加できるかどうかを確認できるのはこれだけです。

ここで本当のキッカーは、Justin TadlockのMembersプラグインを使用して、「クライアント」と呼ばれる新しい役割を作成したことです。
しかし、私が彼らに新しいユーザーを作成する能力を与えれば、彼らは私の「スーパーアドミニストレーター」の役割を選ぶこともでき、それはすべてを見ることができます。それで、ある意味で、彼らはちょっとシステムを少しだまします。

あるユーザーが新しいユーザーを設定したり、ユーザーを編集したりできるようにするために、特定の役割を「隠す」ことはできますか?または、ロールに基づいてユーザーIDの追加/編集画面からロールIDを削除しますか?
WordPressがユーザーのアクセス許可に対して行うことの意味からは少し外れているようですが、管理上の観点からは、少なくとも私の頭の中では便利に思えます。)

ありがとうございます。

3
Zach

UIのselect要素

user-edit.phpでは、UIにドロップダウンが表示されます。ドロップダウン<select>ラッパーはハードコーディングされています。

それから管理者インターフェースは気の利いたことをします 1) インラインコメントに従って:// Get the highest/primary role for this user。実際、ユーザーに割り当てられていたfirstロールを取得しています(これは覚えておく必要があります)。

それなら基本的にはwp_dropdown_roles()の呼び出しだけです。この関数は、利用可能なロールをループしてそれらを<option>要素の中にラップすること以外、何もしません。 しかし 、それがする一つのクールなことがあります:それはget_editable_roles()によって検索されたロールを使います。そして、ここに魔法が来ます! global $wp_roles->roles用のフィルター。デフォルトではこれはallrolesを返しますが、ジャンプして必要なものを設定解除することができます。

// Add this as mu-plugin
function wpse32738_get_editable_roles( $editable_roles )
{
    if ( current_user_can( 'client' ) )
        // unset whatever you need here.

    return $editable_roles;
}
add_filter( 'editable_roles', 'wpse32738_get_editable_roles' );

1)役割は「フラット」システムです。ロールは他の機能を無効にする機能を持つことができます。

7
kaiser

私はKaiserの指示に従って、ユーザ管理機能を特定の役割に付与し、任意の組み込みの役割への特権の昇格を防ぐことを可能にする次のコードを書きました(カスタムの仲介役割を定義する場合は私のコードを調整する必要があります)。

// add user-management capabilities
add_action('admin_init', function() {
  $role = get_role( 'editor' );

  $role->add_cap( 'list_users' );
  $role->add_cap( 'create_users' );
  $role->add_cap( 'edit_users' );
  $role->add_cap( 'delete_users' );
});

// prevent privilege escalation
add_filter( 'editable_roles', function( $editable_roles ) {
  if ( ! current_user_can( 'promote_users' ) ) {
    // always remove admin roles
    if ( isset($editable_roles['super_admin']) ) {
      unset( $editable_roles['super_admin'] );
    }
    unset( $editable_roles['administrator'] );

    // remove other roles conditionnaly to prevent escalation
    if ( ! current_user_can( 'editor' ) ) {
      unset( $editable_roles['editor'] );

      if ( ! current_user_can( 'author' ) ) {
        unset( $editable_roles['author'] );

        if ( ! current_user_can( 'contributor' ) ) {
          unset( $editable_roles['contributor'] );
        }
      }
    }
  }

  return $editable_roles;
});

このコードを使用すると、寄稿者にユーザー管理機能を付与することができ、他の寄稿者または購読者を作成できるようになります。

_注意_ :これは厄介な解決策です。ネットワークモードでのテストは行われておらず、入力の検証も行われていません。悪意のあるユーザーが権限を昇格させる可能性があります。

1
Louis-Rémi