问题描述
我有大量的用户与编辑 Capabilities 帮助通过提交的帖子。这是我目前为此角色设置的:
您可以看到,它们被允许使用 edit_posts
和 edit_others_posts
,但它们不能 edit_published_posts
。这意味着他们可以编辑处于草稿和待处理状态的帖子。
现在,我想限制他们只能编辑待处理的帖子。所以,他们将无法触及起草稿 (除非是作者的作者) 。不幸的是没有能力像 edit_pending_posts
… 应该有。
我该如何解决?
最佳解决方法
这实际上并不困难要添加新功能,请调用 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
功能。
因此,当有些人想使用 edit_post
功能时,我们必须过滤 user_has_cap
并查看我们的新的 edit_pending_posts
功能。
我也包括 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;
}
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。