我正在编写一个插件,它会创建一个新的post_type和一个相应的角色,只能添加/编辑/等新的post_type。一切都按预期工作,但分配了我的自定义角色的用户无法查看仪表板。用户登录后,会立即收到以下错误:
“您没有足够的权限来访问此页面。”
但是,登录成功,当用户浏览网站时,“编辑”链接会显示在自定义帖子上。此用户甚至可以通过工具栏编辑/添加新的自定义帖子,但只要他/她单击“仪表板”或未直接链接到自定义post_type的任何其他链接,他们就会收到上述错误消息。
我认为这意味着我的自定义功能正在运行...但太好了(因为太严格了)。我还想允许基本的“订阅者”权限以及我为自定义post_type定义的功能。我已经阅读并重新阅读了有关功能的代码。角色,似乎我应该能够通过将'read' => true
添加到我的功能数组中来做我想要的事情,但它似乎没有起作用。这是我的代码:
add_action('init', 'setup_dictionary_post');
//Register custom post type
function setup_dictionary_post() {
$capabilities = array(
'publish_posts' => 'publish_dictionary_entry',
'edit_posts' => 'edit_dictionary_entry',
'edit_others_posts' => 'edit_others_dictionary_entry',
'delete_posts' => 'delete_dictionary_entry',
'delete_others_posts' => 'delete_others_dictionary_entry',
'read_private_posts' => 'read_private_dictionary_entry',
'edit_post' => 'edit_dictionary_entry',
'delete_post' => 'delete_dictionary_entry',
'read_post' => 'read_dictionary_entry'
);
$labels = array(
'name' => 'Dictionary Entries',
'singular_name' => 'Dictionary Entry',
'menu_name' => 'Dictionary Entries',
'add_new' => 'Add New',
'add_new_item' => 'Add New Dictionary Entry',
'edit' => 'Edit entry',
'edit_item' => 'Edit Dictionary Entry',
'new_item' => 'New Dictionary Entry',
'view' => 'View Dictionary Entry',
'view_item' => 'View Dictionary Entry',
'search_items' => 'Search Dictionary Entries',
'not_found' => 'No Dictionary Entries Found',
'not_found_in_trash' => 'No Dictionary Entries Found in Trash',
'parent' => 'Parent Dictionary Entry',);
register_post_type('dictionary_entry', array(
'label' => 'Dictionary Entries',
'description' => '',
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'capability_type' => 'dictionary_entry',
'capabilities'=>$capabilities,
'hierarchical' => false,
'rewrite' => array('slug' => ''),
'query_var' => true,
'supports' => array('title','comments','revisions','thumbnail','author','page-attributes',),
'labels' => $labels,
)
);
flush_rewrite_rules(false);
/********************** CUSTOM ROLE *****************************/
add_role('dictionary_entry_author', 'Dictionary Helper', array(
'publish_dictionary_entry' => true,
'edit_dictionary_entry' => true,
'edit_others_dictionary_entry' => true,
'delete_dictionary_entry' => true,
'delete_others_dictionary_entry' => true,
'read_private_dictionary_entry' => true,
'edit_dictionary_entry' => true,
'delete_dictionary_entry' => true,
'read_dictionary_entry' => true,
// more standard capabilities here
'read' => true,
));
//I do some other stuff later in this function that isn't important.
//For example, I define a custom taxonomy for the new post_type...
}
我不确定为什么'read'=>true,
没有达到我想要的效果。我已经阅读了几个教程,并收到了一些代码,其中“元素功能”被映射,但我没有在我的代码中使用它,因为我不明白它是如何工作的,它不是似乎< / strong>是必要的。我错了。
答案 0 :(得分:9)
我不知道为什么会这样,但我在add_role()之后立即添加了这个:
$role =& get_role('dictionary_entry_author');
$role->add_cap('read');
......它有效!我很想知道为什么add_cap
方法有效,而在数组中声明它却没有。
答案 1 :(得分:0)
您将获得 NULL ,因为您已经拥有角色dictionary_entry
。
您可以使用不同的role_name创建另一个,此外 - 您可以删除或更改存在的上限。