Izinkan Editor mengedit posting yang tertunda tetapi tidak menyusunnya

8

Saya memiliki sejumlah besar pengguna dengan Kemampuan Editor yang membantu melalui pengiriman kiriman. Ini adalah pengaturan saya saat ini untuk peran ini:

Kemampuan Editor

Seperti yang Anda lihat, mereka diizinkan edit_postsdan edit_others_poststetapi mereka tidak bisa edit_published_posts. Ini berarti mereka dapat mengedit posting yang berada dalam status Draft dan Pending .

Sekarang, saya ingin membatasi mereka hanya untuk dapat mengedit posting yang tertunda. Jadi, mereka tidak akan memiliki kemampuan untuk menyentuh posting konsep ( kecuali jika mereka adalah penulis posting). Sayangnya tidak ada kemampuan seperti edit_pending_posts... harus ada .

Bagaimana saya mengatasi ini?

Christine Cooper
sumber

Jawaban:

4

Ini sebenarnya tidak sulit. Untuk menambahkan kemampuan baru, hubungi WP_Roles->add_cap(). Anda harus melakukan ini sekali saja, karena akan disimpan dalam database. Jadi kami menggunakan pengait aktivasi plugin.

Catatan untuk pembaca lain: Semua kode berikut adalah wilayah plugin .

register_activation_hook( __FILE__, 'epp_add_cap' );

/**
 * Add new capability to "editor" role.
 *
 * @wp-hook "activate_" . __FILE__
 * @return  void
 */
function epp_add_cap()
{
    global $wp_roles;

    if ( ! isset( $wp_roles ) )
        $wp_roles = new WP_Roles;

    $wp_roles->add_cap( 'editor', 'edit_pending_posts' );
}

Sekarang kita harus memfilter semua panggilan untuk ...

current_user_can( $post_type_object->cap->edit_post, $post->ID );

... karena itulah cara WordPress memeriksa apakah pengguna dapat mengedit posting. Secara internal, ini akan dipetakan dengan edit_others_postskemampuan untuk posting penulis lain.

Jadi kita harus memfilter user_has_capdan melihat edit_pending_postskemampuan baru kita ketika beberapa orang ingin menggunakan edit_postkemampuan itu.

Saya sudah memasukkan delete_postjuga, karena ini juga semacam suntingan.

Terdengar rumit, tetapi sangat sederhana:

add_filter( 'user_has_cap', 'epp_filter_cap', 10, 3 );

/**
 * Allow editing others pending posts only with "edit_pending_posts" capability.
 * Administrators can still edit those posts.
 *
 * @wp-hook user_has_cap
 * @param   array $allcaps All the capabilities of the user
 * @param   array $caps    [0] Required capability ('edit_others_posts')
 * @param   array $args    [0] Requested capability
 *                         [1] User ID
 *                         [2] Post ID
 * @return  array
 */
function epp_filter_cap( $allcaps, $caps, $args )
{
    // Not our capability
    if ( ( 'edit_post' !== $args[0] && 'delete_post' !== $args[0] )
        or empty ( $allcaps['edit_pending_posts'] )
    )
        return $allcaps;

    $post = get_post( $args[2] );


    // Let users edit their own posts
    if ( (int) $args[1] === (int) $post->post_author
        and in_array(
            $post->post_status,
            array ( 'draft', 'pending', 'auto-draft' )
        )
    )
    {
        $allcaps[ $caps[0] ] = TRUE;
    }
    elseif ( 'pending' !== $post->post_status )
    { // Not our post status
        $allcaps[ $caps[0] ] = FALSE;
    }

    return $allcaps;
}
fuxia
sumber
Saya membuat tes dan mengalami beberapa masalah. Pertama, saya telah edit_postsdan edit_others_poststerus dengan yang baru edit_pending_posts. Saya mencoba hanya memiliki edit_pending_poststanpa dua lainnya dan menu pos tidak muncul. Saat menguji ini, saya menemukan bahwa saya dapat menambahkan posting baru, tetapi tidak dapat menyimpan konsep ( You are not allowed to edit this postpemberitahuan). Apakah Anda mencoba menyimpan pos Anda sendiri di peran ini? Mengedit posting yang tertunda baik-baik saja.
Christine Cooper
@ChristineCooper Ini terjadi karena $post->post_authordilewatkan sebagai string , tetapi $args[1]sebagai integer. Terkadang. WordPress bodoh! Saya memperbaikinya dengan melemparkan keduanya ke integer. Dan saya memperbolehkan editor untuk mengedit posting mereka yang diterbitkan. Jika Anda tidak menginginkannya, hapus returnbaris di blok setelahnya // Let users edit their own posts.
fuxia
Oke! Masih ada satu masalah. Saya menguji kode Anda yang diperbarui dan berhasil! Namun saya tidak ingin memperbolehkan editor untuk mengedit posting mereka sehingga saya menghapus return $allcaps;baris itu dan masalah izin yang sama muncul dengan penghematan konsep. Mengapa?
Christine Cooper
Hm, bekerja untuk saya. Pengaturan kemampuan saya
fuxia
Hanya untuk mengonfirmasi, Anda merujuk untuk menghapus baris kembali di bawah $allcaps[ $caps[0] ] = TRUE;? Sangat aneh bahwa saya mengalami ini, tidak masuk akal secara logis bahwa itu tidak akan bekerja untuk saya jika itu cocok untuk Anda, di sini adalah pengaturan saya: i.imgur.com/X3bv9rH.png
Christine Cooper