我的问题是所有功能都按预期工作,但非管理员无法创建新的小部件。单击“添加新”按钮,但显示“您没有足够的权限”消息。客户端已取消选中所有标准功能,例如edit_posts(出于其他原因,我出现之前)。那么也许这就是问题所在?这是我的相关代码:
public static function manage_plugin_cap($action = 'add_cap'){
$roles = get_editable_roles();
$caps = array('edit_widget','edit_widgets','read_widgets');
$admin_caps = array('edit_other_widgets','publish_widgets','read_private_widgets','delete_widgets');
foreach ($GLOBALS['wp_roles']->role_objects as $key => $role) {
if (isset($roles[$key])) {
if ($key == 'administrator'){
foreach ($admin_cap as $c){
if ($action=='add_cap')
{$role->add_cap( $c, false );}
else {$role->{$action}( $c );}
}
}
foreach ($cap as $c){
if ($action=='add_cap')
{$role->add_cap( $c, false );}
else {$role->{$action}( $c );}
}
}
}
}
register_post_type( $this->prefix.'_'.$single, $args );
$args = array(
'labels' => $labels,
'description' => __( 'Description.', $this->text_domain ),
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => 'edit.php?post_type={$single}',
'query_var' => true,
'rewrite' => array('slug' => $single,'with_front'=>true ),
'capability_type' => 'widget',
'has_archive' => $plural,
'can_export' => true,
'hierarchical' => false,
'menu_position' => null
);
有谁看到我错过了什么?我尝试添加'create_widgets'没有成功,'publish_widgets'添加到所有角色(即使我不希望他们能够),但这也不起作用。谢谢!
编辑:我从args中删除了'capability_type'。当我定义添加我自己的时候,我不认为这是必需的(也许只有在从现有功能映射时才需要它,所以wp知道如何命名新的功能)。
更新:我有机会重新审视这一点,试着把它弄好。 我在register_post_type数组中有这些元素:
'capability_type' => 'widget',
'map_meta_cap' => false,
除了create_widgets之外似乎适用于所有内容。 当我转储$ GLOBALS ['wp_post_types'] ['my_cpt']时,我得到了
public 'cap' =>
object(stdClass)[434]
public 'edit_post' => string 'edit_widget' (length=10)
public 'read_post' => string 'read_widget' (length=10)
public 'delete_post' => string 'delete_widget' (length=12)
public 'edit_posts' => string 'edit_widgets' (length=11)
public 'edit_others_posts' => string 'edit_others_widgets' (length=18)
public 'publish_posts' => string 'publish_widgets' (length=14)
public 'read_private_posts' => string 'read_private_widgets' (length=19)
public 'create_posts' => string 'edit_widgets' (length=11)
所以我不确定为什么它将'create_posts'显示为'edit_widgets'?
答案 0 :(得分:1)
“您没有足够的权限来访问此页面。”消息意味着用户无法访问创建帖子的管理页面 - 在其他功能之前检查,例如“edit_widgets”。例如,在您的情况下,用户具有“edit_widgets”功能,理论上他可以创建新的“小部件”帖子,但他无法访问创建帖子的管理页面。这就是为什么:
据我记忆,当register_post_type的“show_in_menu”参数不是“true”时,不会创建默认菜单项“Add {post_type}”,因此用户需要内置的“edit_posts”功能才能访问“post-new.php?post_type = {post_type}”(他们在那里创建新帖子)。
解决方法:
手动添加子菜单并将“edit_widgets”设置为访问页面所需的功能(如果此菜单页面嵌套在第二级菜单项下,它将不可见 - 如果您要对多个帖子类型进行分组,则非常有用在一个菜单下父母)
add_submenu_page({parent_menu_link}, 'Add Widget', 'Add Widget', 'edit_widgets', 'post-new.php?post_type={post_type}');
这里的关键是“edit_widgets”功能,它将使具有“edit_widgets”功能的任何人都可以访问“添加窗口小部件”页面。
PS:您可能还需要将“map_meta_cap”设置为true,请参阅https://codex.wordpress.org/Function_Reference/register_post_type
答案 1 :(得分:0)
我想我想出了这个。我正在错误地映射'create_posts'。正如我在我的问题中提到的,默认的wp行为是这样映射的:
'create_posts' => 'edit_widgets'
创建角色时,我就像这样映射
'create_posts' => 'create_widgets',
所以我回到了默认的映射,它可以工作。