这其实并不难。要添加新功能,请调用WP_Roles->add_cap()
. 您只需执行一次,因为它将存储在数据库中。所以我们使用插件激活挂钩。
其他读者注意:以下所有代码都是plugin territory.
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\' );
}
现在我们必须筛选所有…
current_user_can( $post_type_object->cap->edit_post, $post->ID );
…因为这就是WordPress检查用户是否可以编辑帖子的方式。在内部,这将映射到
edit_others_posts
其他作者职位的能力。
所以我们必须过滤user_has_cap
看看我们的新edit_pending_posts
当一些人想要使用edit_post
能力。
我已经包括delete_post
也是,因为这也是一种编辑。
听起来很复杂,但其实很简单:
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;
}