Пользовательская роль Wordpress с пользовательскими возможностями не может получить доступ к панели инструментов. - PullRequest
4 голосов
/ 21 ноября 2011

Я пишу плагин, который создает новый 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, не выполняет то, что я хочу. Я прочитал несколько учебных пособий и получил некоторый код, в котором отображаются «мета-возможности», но я не использую его в своем коде, потому что я не понимаю, как он работает, и он не кажется необходимо. Я могу ошибаться.

Ответы [ 2 ]

9 голосов
/ 22 ноября 2011

Понятия не имею ПОЧЕМУ это сработало, но я добавил это сразу после add_role ():

    $role =& get_role('dictionary_entry_author'); 
    $role->add_cap('read');

... и это сработало!Я хотел бы знать, почему метод add_cap работал, тогда как его объявление в массиве возможностей - нет.

0 голосов
/ 23 мая 2017

Вы получите NULL , потому что у вас уже есть роль dictionary_entry.Вы можете создать еще один с другим ролью_имя, более того - вы можете удалить или изменить ограничение для существующих.

...