web-dev-qa-db-ja.com

機能のグループ:複数の役割を持つユーザー

私はWordPressで設定された役割と機能、つまりユーザーに割り当てることができる役割にまとめられたきめ細かい機能を理解していると確信しています。コードは、ロールではなく、細かい機能を確認する必要があります(特定のロールの機能が変わる可能性があるため)。役割は必ずしも階層的ではありません(デフォルトの役割はそうですが)。

ユーザーに複数の役割を割り当てる方法はありますか?あるいは、複数の機能グループを持ち、1つ以上のグループをユーザーに関連付けることです。私のサイトのしくみには、Webページの更新、フォーラムの調整、イベントカレンダーの更新など、明らかな責任がいくつかあります。各責任には、それに関連付けられたタスクを実行するために必要な機能のグループがあります。ユーザーが1つ以上の職責を実行できるようにしたいです。そのため、ユーザーAはWebページとイベントカレンダーを更新することはできますが、フォーラムを管理することはできません(十分に適切ではありません)。

責任の可能な組み合わせごとに役割を定義するのではなく、これを行う方法はありますか?

9
lpryor

基になるWP_Userクラスが複数のロールをサポートしているので、ロールが複数ないことで長い間私をいらいらさせています。私は代わりのソフトウェアソリューションを探すことさえ考えました。 @ lpryor - あなたの投稿を読んだ後、私は自分でそれを実装するように動機づけられました。

私のために別のプラグインを作成するのが面倒だったので、users.phpファイルをハックしなければなりませんでしたが、驚くほど短い行数で済みました。明らかにこれは間違ったやり方であるので、私が将来十分にやる気になれば、それを正しくやろうと思うかもしれません。

最新バージョンのWordpressにアップグレードできないかどうかを気にしないのであれば(これを推奨)、以下のコードスニペットで複数の役割を実装できます。私はワードプレスの専門家ではないことに注意してください。関連ファイルを開いて変更を加えたのは、自分が行っていたことの完全な意味を理解しようとせずにでした。コードは私には合理的に思えますが、私は私の人生でそれを信頼しません。

(私は3.2を使っていますので、あなたの行番号は変わるかもしれません)150行目の直前のclass-wp-users-list-table.phpに以下のようなものを追加してください:

<div class="alignleft actions">
    <label class="screen-reader-text" for="remove_role"><?php _e( 'Remove role &hellip;' ) ?></label>
    <select name="remove_role" id="remove_role">
        <option value=''><?php _e( 'Remove role &hellip;' ) ?></option>
        <?php wp_dropdown_roles(); ?>
    </select>
    <?php submit_button( __( 'Remove' ), 'secondary', 'changeit', false ); ?>
</div>

次にcurrent_account関数を以下のように変更してください。

function current_action() {
    if ( isset($_REQUEST['changeit']) ) {
        if ( !empty($_REQUEST['new_role']) )
            return 'promote';
        elseif ( !empty($_REQUEST['remove_role']) )
            return 'remove_role';
    }

    return parent::current_action();

}

今すぐusers.phpの71行目から76行目をコメントアウトする

/*
if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
    $update = 'err_admin_role';
    continue;
}
*/

83行目のset_roleをadd_roleに置き換えます。

$user->add_role($_REQUEST['new_role']);

92行目で、次の行を追加します(これは、プロモートアクションからのコピー&ペーストです。促進する機能がロールの削除に適していることを確認していません)。

case 'remove_role':
    check_admin_referer('bulk-users');

    if ( ! current_user_can( 'promote_users' ) )
            wp_die( __( 'You can&#8217;t edit that user.' ) );

    if ( empty($_REQUEST['users']) ) {
            wp_redirect($redirect);
            exit();
    }

    $editable_roles = get_editable_roles();
    if ( empty( $editable_roles[$_REQUEST['remove_role']] ) )
            wp_die(__('You can&#8217;t remove that role'));

    $userids = $_REQUEST['users'];
    $update = 'remove_role';
    foreach ( $userids as $id ) {
            $id = (int) $id;

            if ( ! current_user_can('promote_user', $id) )
                    wp_die(__('You can&#8217;t edit that user.'));
            // The new role of the current user must also have promote_users caps
            // Need to think this through
            /*
            if ( $id == $current_user->ID && !$wp_roles->role_objects[$_REQUEST['new_role']]->has_cap('promote_users') ) {
                    $update = 'err_admin_role';
                    continue;
            }
            */

            // If the user doesn't already belong to the blog, bail.
            if ( is_multisite() && !is_user_member_of_blog( $id ) )
                    wp_die(__('Cheatin&#8217; uh?'));

            $user = new WP_User($id);
            $user->remove_role($_REQUEST['remove_role']);
    }

    wp_redirect(add_query_arg('update', $update, $redirect));
    exit();

370行目で、以下を追加してください。

case 'remove_role':
    $messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
    break;
3
Adi Eyal

ユーザーロールエディタプラグイン ユーザーの複数のロールを処理します。

インストール後、各ユーザーの下のUsers>はCapabilitiesオプションです。 UREは最初のWPロールを "プライマリロール"として扱い、 "その他のロール"を追加することを可能にします。

3
garec

Membersプラグイン をカスタム作成機能と一緒に使用します。

1人の人に複数の役割を割り当てることはできませんが、任意の役割を作成し、その役割が持つ機能を指定することはできます。

テンプレートでは、 current_user_can() のように使用できます。

0
Steven