您可能可以使用过滤器user_has_cap
在检查特定功能时使用(可在中找到/wp-includes/class-wp-user.php
在里面has_cap
):
/**
* Dynamically filter a user\'s capabilities.
*
* @since 2.0.0
* @since 3.7.0 Added the user object.
*
* @param array $allcaps An array of all the user\'s capabilities.
* @param array $caps Actual capabilities for meta capability.
* @param array $args Optional parameters passed to has_cap(), typically object ID.
* @param WP_User $user The user object.
*/
$capabilities = apply_filters( \'user_has_cap\', $this->allcaps, $caps, $args, $this );
所以它会是这样的:
add_filter(\'user_has_cap\',\'check_post_taxonomy\',10,4);
function check_post_taxonomy($allcaps,$caps,$args,$user) {
global $post; if (!isset($post)) {return $allcaps;}
$group = get_user_meta($user->ID,\'special_edit_group\',true);
$taxonomy = \'taxonomy_\'.$group; // maybe set to a, b or c?
$terms = get_the_terms($post->ID,$taxonomy);
// if there are no terms, remove the user capability(s) for this check
// you may have to experiment to remove all the ones you want to
if (!$terms) {
unset($allcaps[\'edit_properties\']);
}
return $allcaps;
}
我这样做是因为我意识到这个问题的逻辑并不完全正确。如果一个帖子类型分配了分类法a、B和C,即使您为角色组设置了这些功能过滤器,这三个角色组仍然可以编辑该帖子类型中的任何内容。换句话说,在任何情况下,分类法A、B或C实际上都是“未”分配的。
相反,我认为你真正的意思是“检查这篇文章在分类法A中是否有任何术语分配给它”。。。如果是的话,沿着A组编辑它,依此类推。(注意:我不知道上述代码是否适用于这种情况,它可能需要更多的工作。例如,目前这是检查组的用户元密钥,而不是实际的角色/组。)