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_posts
kemampuan untuk posting penulis lain.
Jadi kita harus memfilter user_has_cap
dan melihat edit_pending_posts
kemampuan baru kita ketika beberapa orang ingin menggunakan edit_post
kemampuan itu.
Saya sudah memasukkan delete_post
juga, 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;
}
edit_posts
danedit_others_posts
terus dengan yang baruedit_pending_posts
. Saya mencoba hanya memilikiedit_pending_posts
tanpa 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 post
pemberitahuan). Apakah Anda mencoba menyimpan pos Anda sendiri di peran ini? Mengedit posting yang tertunda baik-baik saja.$post->post_author
dilewatkan 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, hapusreturn
baris di blok setelahnya// Let users edit their own posts
.return $allcaps;
baris itu dan masalah izin yang sama muncul dengan penghematan konsep. Mengapa?$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