Okay, so I have done it.
Reading about roles and capabilities: http://codex.wordpress.org/Roles_and_Capabilities
A default set of capabilities is pre-assigned to each role, but other capabilites can be assigned or removed using the add_cap() and remove_cap() functions. New roles can be introduced or removed using the add_role() and remove_role() functions.
Add a capability: http://codex.wordpress.org/Function_Reference/add_cap
If you want to add a new role with capabilities, just add them when you add the role using add_role();.
Reading about adding a menu: http://codex.wordpress.org/Function_Reference/add_menu_page
$capability (string) (required) The capability required for this menu
to be displayed to the user.
Step 1: Register an activation hook to create a new user role
register_activation_hook( __FILE__, 'plugin_newuserrole' );
function plugin_newuserrole() {
global $wp_roles;
$result = add_role(
'user_dj',
__( 'DJ' ),
array(
'read' => true, // true allows this capability
)
);
/* if ( null !== $result ) {
echo 'Yay! New role created!';
}
else {
echo 'Oh... the user_dj role already exists.';
} */
}
Step 2: Add a capability to the role
function plugin_caps() {
// gets the new role made earlier
$role = get_role( 'user_dj' );
// This only works, because it accesses the class instance.
// would allow the author to edit others' posts for current theme only
$role->add_cap( 'dj_hk_user' );
}
add_action( 'admin_init', 'plugin_caps');
Step 3: Change capability options in menu and submenu
function add_your_menu() {
add_menu_page( 'Title', 'Menu Label', 'dj_hk_user', 'plugin-slug.php', '', 'dashicons-microphone');
add_submenu_page( 'plugin-slug.php', 'Overview', 'Overview', 'dj_hk_user', 'plugin-slug.php', 'function_of_overview' );
add_submenu_page( 'plugin-slug.php', 'Sample Edit Title', 'Sample Edit Label', 'dj_hk_user', 'sample_slug', 'function_of_page1' );
}
add_action('admin_menu', 'add_your_menu');