自定义发布类型的功能MAP_META_CAP问题

时间:2013-02-25 作者:Ben Racicot

我已经创建了一个CPT,向其添加了功能,并成功地将这些功能添加到订阅服务器角色。

然而,映射显然不起作用,因为我在发布时出错,订阅者无法编辑自己的帖子(如果他们是作者,下面的函数允许这样做)。为什么我的map\\u meta\\u cap函数不能工作?

我整个周末都在做这件事,所以我不得不求助于社区。提前谢谢。

function lst_map_meta_cap( $caps, $cap, $user_id, $args ) {

/* If editing, deleting, or reading an event, get the post and post type object. */
if ( \'edit_lstpost\' == $cap || \'delete_lstpost\' == $cap || \'read_lstpost\' == $cap ) {
$post = get_post( $args[0] );
$post_type = get_post_type_object( $post->post_type );
$caps = array();

switch( $cap ) {
case \'edit_lstpost\':
$caps[] = ( $user_id == $post->post_author ) ? $post_type->cap->edit_posts : $post_type->cap->edit_others_posts;
break;
case \'delete_lstpost\':
$caps[] = ( $user_id == $post->post_author ) ? $post_type->cap->delete_posts : $post_type->cap->delete_others_posts;
break;
case \'read_lstpost\':
$caps[] = ( \'private\' != $post->post_status || $user_id == $post->post_author ) ? $caps[] = \'read\' : $post_type->cap->read_private_posts;
break;
 }
}

return $caps;
}

add_filter( \'map_meta_cap\', \'lst_map_meta_cap\', 10, 4 );
编辑:在阅读了2天之后,管理员拒绝按照我的理解工作。我已经对管理员/订阅者角色应用/删除了每个CAP,但只能查看或创建(有一个错误,但仍然有效)

以下是CPT帽:

[edit_post] => edit_lstpost
[read_post] => read_lst
[delete_post] => delete_lstpost
[edit_posts] => edit_lstposts
[edit_others_posts] => edit_lstothers
[publish_posts] => publish_lst
[read_private_posts] => read_privatelst
[delete_posts] => delete_lstposts
[delete_private_posts] => delete_private_lstcapss
[delete_published_posts] => delete_published_lstcapss
[delete_others_posts] => delete_lstothers
[edit_private_posts] => edit_private_lstcapss
[edit_published_posts] => edit_published_lstcapss
[edit_page] => edit_lstpage
[create_posts] => edit_lstposts

2 个回复
最合适的回答,由SO网友:Ben Racicot 整理而成

事实证明,映射自己的元功能是一个非常糟糕的主意。为了解决这个问题,我最终完成了使用带有两个插件的map\\u meta\\u cap函数所需的步骤。

使用[Map Cap] 自动将我的新自定义帖子类型的元功能映射到我的特定用户角色。

然后必须安装非常有用的Members Plugin 我必须手动使用add\\u cap分配功能,并在插件中仔细检查以正确分配cap。

function role_set (){
global $wp_roles;

$role = get_role( \'administrator\' );
$role->add_cap( \'publish_POST_TYPE\' );
$role->add_cap( \'edit_POST_TYPE\' );
$role->add_cap( \'edit_others_POST_TYPE\' );
$role->add_cap( \'delete_others_POST_TYPE\' );
$role->add_cap( \'read_private_POST_TYPE\' );
$role->add_cap( \'manage_POST_TYPE\' );

}
add_action(\'init\', \'role_set\');
然后在members插件中再次检查它。我花了4天的时间使我的自定义帖子类型功能与所有角色都能正常工作。我相信WordPress早就应该有一些核心构建角色和上限控制。希望这对任何人都有帮助。

SO网友:nebulousGirl

对于同样在这个问题上苦苦挣扎的人,有一个很棒的教程,清楚地解释了如何在不依赖插件的情况下完成这项工作:https://3.7designs.co/blog/2014/08/restricting-access-to-custom-post-types-using-roles-in-wordpress/

如果需要创建新角色,则必须使用add\\u role函数在激活挂钩上创建。

之后,确保在post类型注册中有以下参数:

\'capability_type\'     => array(\'POST_TYPE\',\'POST_TYPES\'),
\'map_meta_cap\'        => true,
最后一步涉及将权限添加到admin_init 挂钩:

 // Add the roles you\'d like to administer the custom post types
 $roles = array(\'NEW_ROLE\',\'editor\',\'administrator\');

 // Loop through each role and assign capabilities
 foreach($roles as $the_role) { 

     $role = get_role($the_role);
     $role->add_cap( \'read_POST_TYPE\');
     $role->add_cap( \'read_private_POST_TYPES\' );
     $role->add_cap( \'edit_POST_TYPE\' );
     $role->add_cap( \'edit_POST_TYPES\' );
     $role->add_cap( \'edit_others_POST_TYPES\' );
     $role->add_cap( \'edit_published_POST_TYPES\' );
     $role->add_cap( \'publish_POST_TYPES\' );
     $role->add_cap( \'delete_others_POST_TYPES\' );
     $role->add_cap( \'delete_private_POST_TYPES\' );
     $role->add_cap( \'delete_published_POST_TYPES\' );

 }

结束

相关推荐