Nhóm khả năng: người dùng có nhiều vai trò?


9

Tôi khá chắc chắn rằng tôi hiểu các vai trò và thiết lập khả năng trong WordPress: các khả năng chi tiết, được nhóm lại với nhau trong các vai trò có thể được gán cho người dùng. Mã phải kiểm tra các khả năng chi tiết, không phải các vai trò (vì các khả năng cho các vai trò cụ thể có thể thay đổi). Vai trò không nhất thiết phải phân cấp (mặc dù vai trò mặc định là).

Có cách nào để gán nhiều vai trò cho người dùng không? Ngoài ra, có một số nhóm khả năng và liên kết một hoặc nhiều nhóm với người dùng? Cách trang web của tôi hoạt động, có một số trách nhiệm rõ ràng: cập nhật trang web, kiểm duyệt diễn đàn, cập nhật lịch sự kiện, v.v. Mỗi trách nhiệm có một nhóm các khả năng cần thiết để thực hiện các nhiệm vụ liên quan đến nó. Tôi muốn cho phép người dùng thực hiện một hoặc nhiều trách nhiệm. Vì vậy, người dùng A có thể cập nhật các trang web và lịch sự kiện nhưng không kiểm duyệt các diễn đàn (không đủ khéo léo), nhưng người dùng B có thể kiểm duyệt các diễn đàn, cập nhật lịch sự kiện, nhưng không được phép gần các trang web.

Nói ngắn gọn về việc xác định vai trò cho mỗi sự kết hợp trách nhiệm có thể có, có cách nào để làm việc này không?


Các Vai trò Scoper Plugin có thể thực hiện những gì bạn đang tìm kiếm.
Devin Humbert

Tôi nghĩ rằng đó là nhiều hơn trên cơ sở mỗi trang hoặc mỗi bài viết, đó không thực sự là những gì tôi đang tìm kiếm, nhưng tôi sẽ điều tra thêm một chút, cảm ơn.
lpryor

@lpryor - Vai trò Scoper có nhiều tùy chọn, bạn có thể kiểm soát mỗi trang và mỗi bài đăng cho người dùng hoặc nhóm, nhưng cũng theo từng danh mục, mỗi phân loại và mỗi loại bài, vì vậy dường như bạn có thể đạt được những gì bạn sau đó với điều này.
Milo

Hãy thử một gist.github.com/nikolov-tmw/7808046 Thêm nhiều hộp kiểm vào Lựa chọn vai trò
OzzyC817

Câu trả lời:


3

Việc thiếu vai trò đối tác đã khiến tôi bực bội trong một thời gian dài vì lớp WP_User bên dưới hỗ trợ nhiều vai trò. Tôi thậm chí đã cân nhắc tìm kiếm một giải pháp phần mềm thay thế. @lpryor - Sau khi đọc bài viết của bạn, tôi đã có động lực để tự mình thực hiện nó.

Phải mất một số dòng ngắn đáng ngạc nhiên để làm mặc dù tôi đã phải hack tệp users.php vì tôi quá lười để tạo một plugin riêng để làm điều đó cho tôi. Rõ ràng đây là cách làm sai vì vậy nếu tôi có đủ động lực trong tương lai, tôi có thể cố gắng làm đúng.

Nếu bạn không quan tâm đến việc có thể nâng cấp lên phiên bản Wordpress mới nhất (mà bạn nên) - bạn có thể thực hiện nhiều vai trò với đoạn mã bên dưới. Xin lưu ý rằng tôi không phải là một chuyên gia về wordpress. Tôi chỉ mở các tệp có liên quan và thực hiện các thay đổi mà không cố gắng hiểu đầy đủ ý nghĩa của việc tôi đang làm. Mã có vẻ hợp lý với tôi nhưng tôi sẽ không tin vào cuộc sống của mình.

(Tôi đang sử dụng 3.2 để số dòng của bạn có thể thay đổi) Trong class-wp-users-list-table.php ngay trước dòng 150 thêm một số như sau:

<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>

sau đó thay đổi hàm current_account để trông giống như thế này

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();

}

Bây giờ trong users.php Nhận xét các dòng 71-76

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

Thay thế set_role trong dòng 83 bằng add_role

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

Tại dòng 92, hãy thêm vào phần sau (Đây chỉ là một bản sao và dán được chỉnh sửa nhẹ từ hành động quảng cáo - Tôi chưa kiểm tra để đảm bảo rằng khả năng của Promotion_user phù hợp để xóa vai trò)

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();

Tại dòng 370 thêm vào như sau

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

Điều này có vẻ tuyệt vời, @ adi-eye, cảm ơn rất nhiều! Tôi sẽ làm việc theo cách của mình thông qua nó và thử nó.
lpryor

@lpryor này, chỉ tự hỏi liệu bạn có quản lý để thực hiện nhiều vai trò mà không hack mã lõi WP không? Sẽ là tuyệt vời để biết! Tôi không thể tìm thấy bất kỳ plugin nào, nhưng đồng thời không muốn hack mã WP cốt lõi. Cảm ơn!
dashaluna

@dashaluna Tôi chưa thể làm được điều này nhưng nó đã đứng đầu danh sách của tôi!
lpryor

5
Hack cốt lõi như thế này không phải là cách để đi. Điều này sẽ được gỡ bỏ trên bất kỳ bản cập nhật của lõi WordPress. Móc nó hoặc quên nó - xin lỗi, nhưng đây là (ngay cả khi nó hoạt động) không có gì nên được khuyến khích.
kaiser

Cập nhật cốt lõi không phải là một thực hành tốt. Sử dụng móc hành động / bộ lọc thay thế.
тнє Sufi

3

Plugin User Role Editor xử lý nhiều vai trò cho người dùng.

Sau khi cài đặt, Người dùng> bên dưới mỗi người dùng là tùy chọn Khả năng. URE coi vai trò WP đầu tiên là "vai trò chính" và cho phép bạn thêm "các vai trò khác".


0

Tôi sử dụng plugin Thành viên cùng với các khả năng tùy chỉnh được tạo.

Bạn không thể chỉ định một số vai trò cho một người, nhưng bạn có thể tạo bất kỳ vai trò nào và chỉ định những khả năng mà vai trò đó có.

Trong tempaltes, bạn có thể sử dụng cái gì đó như current_user_can () .


Vâng, tôi nhận ra rằng. Nhưng tôi đã tự hỏi nếu có bất kỳ cách nào để không phải xác định một vai trò riêng biệt cho mỗi sự kết hợp trách nhiệm có thể. Các tổ hợp có thể làm cho nó không nhiều niềm vui và dễ bị lỗi.
lpryor

Tôi đã không tìm thấy nhiều Google. Gần nhất tôi nhận được là chủ đề này: wordpress.org/support/topic/mult Môn- roles-for-a-user .
Steven
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.