添加自定义功能Wordpress - 用户无法创建新的自定义帖子类型

时间:2016-08-02 15:19:13

标签: wordpress custom-post-type

我的问题是所有功能都按预期工作,但非管理员无法创建新的小部件。单击“添加新”按钮,但显示“您没有足够的权限”消息。客户端已取消选中所有标准功能,例如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'?

2 个答案:

答案 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}”(他们在那里创建新帖子)。

解决方法:

  1. 将“show_in_menu”设置为true:将创建默认菜单
  2. 授予“edit_posts”功能(显然,它允许用户创建分享“edit_posts”功能的帖子。)
  3. 手动添加子菜单并将“edit_widgets”设置为访问页面所需的功能(如果此菜单页面嵌套在第二级菜单项下,它将不可见 - 如果您要对多个帖子类型进行分组,则非常有用在一个菜单下父母)

    add_submenu_page({parent_menu_link}, 'Add Widget', 'Add Widget', 'edit_widgets', 'post-new.php?post_type={post_type}');

  4. 这里的关键是“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',

所以我回到了默认的映射,它可以工作。