Điều này thực sự không khó. Để thêm một khả năng mới, hãy gọi WP_Roles->add_cap()
. Bạn phải làm điều này chỉ một lần, bởi vì nó sẽ được lưu trữ trong cơ sở dữ liệu. Vì vậy, chúng tôi sử dụng một móc kích hoạt plugin.
Lưu ý cho những người đọc khác: Tất cả các mã sau đây là lãnh thổ 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' );
}
Bây giờ chúng tôi phải lọc tất cả các cuộc gọi cho Giáo dục
current_user_can( $post_type_object->cap->edit_post, $post->ID );
Vì đó là cách WordPress kiểm tra nếu người dùng có thể chỉnh sửa bài đăng. Trong nội bộ, điều này sẽ được ánh xạ đến edit_others_posts
khả năng cho các bài viết của tác giả khác.
Vì vậy, chúng tôi phải lọc user_has_cap
và xem xét edit_pending_posts
khả năng mới của chúng tôi khi một số người muốn sử dụng edit_post
khả năng này.
Tôi cũng đã bao gồm delete_post
, bởi vì đây cũng là một loại chỉnh sửa.
Nghe có vẻ phức tạp, nhưng nó thực sự đơn giản:
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
và tiếpedit_others_posts
tục với cái mớiedit_pending_posts
. Tôi đã cố gắng tiếpedit_pending_posts
tục mà không có hai người kia và menu bài đăng không xuất hiện. Khi kiểm tra điều này, tôi thấy rằng tôi có thể thêm một bài đăng mới, nhưng không thể lưu bản nháp (You are not allowed to edit this post
thông báo). Bạn đã thử nghiệm để lưu bài viết của riêng bạn trong vai trò này? Chỉnh sửa bài viết đang chờ xử lý là tốt.