Grup kemampuan: pengguna dengan berbagai peran?

9

Saya cukup yakin saya memahami pengaturan peran dan kapabilitas di WordPress: kapabilitas granular, dikelompokkan bersama dalam peran yang dapat ditetapkan untuk pengguna. Kode harus memeriksa kemampuan granular, bukan peran (karena kemampuan untuk peran tertentu dapat berubah). Peran tidak harus hierarkis (meskipun peran defaultnya adalah).

Apakah ada cara menetapkan beberapa peran kepada pengguna? Atau, memiliki sejumlah grup kemampuan, dan mengaitkan satu atau beberapa grup dengan pengguna? Cara kerja situs saya, ada sejumlah tanggung jawab yang jelas: memperbarui halaman web, memoderasi forum, memperbarui kalender acara, dan sebagainya. Setiap tanggung jawab memiliki sekelompok kemampuan yang diperlukan untuk melakukan tugas-tugas yang terkait dengannya. Saya ingin mengaktifkan pengguna untuk melakukan satu atau lebih tanggung jawab. Jadi pengguna A dapat memperbarui halaman web dan kalender acara tetapi tidak memoderasi forum (hampir tidak cukup bijaksana), tetapi pengguna B dapat memoderasi forum, memperbarui kalender acara, tetapi tidak diizinkan di dekat halaman web.

Pendek mendefinisikan peran untuk setiap kemungkinan kombinasi tanggung jawab, apakah ada cara untuk melakukan ini?

lpryor
sumber
The Role scoper Plugin mungkin dapat mencapai apa yang Anda cari.
Devin Humbert
Saya pikir itu lebih berdasarkan per halaman atau per posting, yang sebenarnya bukan yang saya cari, tapi saya akan selidiki lebih banyak, terima kasih.
lpryor
@ lpryor - Peranan Peran memiliki beberapa opsi, Anda dapat mengontrol per-halaman dan per-posting untuk pengguna atau grup, tetapi juga per-kategori, per-taksonomi, dan per-post-tipe, sehingga sepertinya Anda dapat mencapai apa yang Anda inginkan setelah dengan ini.
Milo
Coba yang satu ini gist.github.com/nikolov-tmw/7808046 Tambahkan beberapa kotak centang ke Pilihan peran
OzzyCzech

Jawaban:

3

Kurangnya peran ganda telah membuat saya kesal sejak lama karena kelas WP_User yang mendasarinya mendukung banyak peran. Saya bahkan mempertimbangkan untuk mencari solusi perangkat lunak alternatif. @ lpryor - setelah membaca posting Anda, saya termotivasi untuk mengimplementasikannya sendiri.

Secara mengejutkan diperlukan beberapa baris untuk dilakukan walaupun saya harus meretas file users.php karena saya terlalu malas untuk membuat plugin terpisah untuk melakukannya untuk saya. Jelas ini adalah cara yang salah untuk melakukannya sehingga jika saya cukup termotivasi di masa depan, saya dapat mencoba melakukannya dengan benar.

Jika Anda tidak peduli untuk dapat meningkatkan ke versi terbaru dari Wordpress (yang seharusnya) - Anda dapat menerapkan beberapa peran dengan potongan kode di bawah ini. Harap diingat bahwa saya bukan ahli wordpress. Saya baru saja membuka file yang relevan dan membuat perubahan tanpa mencoba memahami implikasi penuh dari apa yang saya lakukan. Kode itu tampaknya masuk akal bagi saya tetapi saya tidak akan mempercayainya dengan hidup saya.

(Saya menggunakan 3,2 sehingga nomor baris Anda dapat bervariasi) Di kelas-wp-users-list-table.php sebelum baris 150 tambahkan beberapa seperti berikut:

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

kemudian ubah fungsi current_account agar terlihat seperti ini

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

}

Sekarang di users.php Komentari baris 71-76

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

Ganti set_role di baris 83 dengan add_role

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

Pada baris 92 tambahkan yang berikut ini (Ini hanyalah copy & paste yang diedit ringan dari tindakan promosi - Saya belum memeriksa untuk memastikan bahwa kemampuan promot_user sesuai untuk menghapus peran)

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

Pada baris 370 tambahkan berikut ini

case 'remove_role':
    $messages[] = '<div id="message" class="updated"><p>' . __('Removed role.') . '</p></div>';
    break;
Adi Eyal
sumber
Ini terlihat hebat, @ adi-eyal, terima kasih banyak! Saya akan bekerja dengan cara saya dan mencobanya.
lpryor
@ lpryor, hei, hanya ingin tahu apakah Anda berhasil menerapkan beberapa peran tanpa meretas kode inti WP? Akan menyenangkan untuk tahu! Saya tidak dapat menemukan plugin apa pun, tetapi pada saat yang sama tidak ingin meretas kode WP inti. Terima kasih!
dashaluna
@dashaluna Saya belum bisa melakukan ini, tetapi mendekati bagian atas daftar saya!
lpryor
5
Peretasan inti seperti ini bukan cara yang harus dilakukan. Ini akan dihapus pada setiap pembaruan inti WordPress. Kaitkan atau lupakan saja - maaf, tapi ini (walaupun berfungsi) tidak ada yang direkomendasikan.
kaiser
Memperbarui inti bukanlah praktik yang baik. Gunakan kait tindakan / filter sebagai gantinya.
тнє Sufi
3

Plugin User Role Editor menangani banyak peran untuk pengguna.

Setelah terinstal, Pengguna> di bawah setiap pengguna adalah opsi Kemampuan. URE memperlakukan peran WP pertama sebagai "peran utama" dan memungkinkan Anda untuk menambahkan "peran lain".

Garec
sumber
0

Saya menggunakan plugin Anggota bersama dengan kemampuan yang dibuat khusus.

Anda tidak dapat menetapkan beberapa peran untuk satu orang, tetapi Anda dapat membuat peran apa pun dan menentukan kemampuan apa yang dimiliki peran tersebut.

Di tempaltes, Anda dapat menggunakan sesuatu seperti current_user_can () .

Steven
sumber
Ya saya sadari itu. Tetapi saya bertanya-tanya apakah ada cara untuk tidak harus mendefinisikan peran terpisah untuk setiap kemungkinan kombinasi tanggung jawab. Combinatorics mungkin membuatnya tidak terlalu menyenangkan dan rawan kesalahan.
lpryor
Saya tidak menemukan banyak Googling. Yang paling dekat yang saya dapatkan adalah utas ini: wordpress.org/support/topic/multiple-roles-for-a-user .
Steven