Apply custom role capabilities to administrator (without plugin)

I have a custom role that allows access to only a sigle custom post type. This is all well and good, but now it is only showing up for this role, not for admin and super admin. I’m having a hard time getting it to show up in the admin dashboard.

add_role( 'artists_relations', 'Artist Relations', array( 'post_artists' ) );
function add_theme_caps() {
    $role = get_role( 'artists_relations');
    $role->add_cap('delete_artists');
    $role->add_cap('delete_published_artists');
    $role->add_cap('delete_others_artists');
    $role->add_cap('edit_artists');
    $role->add_cap('edit_published_artists');
    $role->add_cap('edit_others_artists');
    $role->add_cap('publish_artists');
    $role->add_cap('read');
    $role->add_cap('upload_files');
    $role->add_cap('manage_artist_categories');
}
add_action( 'admin_init', 'add_theme_caps');

works great. I tried many suggestions from the internet, but none worked. The latest attempt, though, looked like this

function add_admin_caps() {
    $role = get_role( 'administrator');
    $role->add_cap('delete_artists');
    $role->add_cap('delete_published_artists');
    $role->add_cap('delete_others_artists');
    $role->add_cap('edit_artists');
    $role->add_cap('edit_published_artists');
    $role->add_cap('edit_others_artists');
    $role->add_cap('publish_artists');
    $role->add_cap('read');
    $role->add_cap('upload_files');
    $role->add_cap('manage_artist_categories');
}
add_action( 'admin_init', 'add_admin_caps');

I’ve read a few posts that mentioned removing filters. I don’t understand why this would work for a new role but not let me augment an existing one. But isn’t admin supposed to have rights to everything without having to specify it anyway?

— EDIT — (adding post type registration)

function register_artists_post_type() {
    register_post_type('artists',array(
        'labels' => array(
            'name' => __( 'Artists' ),
            'singular_name' => __( 'Artists' ),
            'add_new' => __( 'Add Artist','Artist' ),
            'add_new_item' => __( 'Add New Artist' ),
            'edit_item' => __( 'Edit Artist' ),
            'new_item' => __( 'New Artist' ),
            'view_item' => __( 'View Artist' ),
            'search_items' => __( 'Search Artists' ),
            'not_found' => __( 'No Artists Found' ),
            'not_found_in_trash' => __( 'No Artists In Trash' ),
            'parent_item_colon' => ''
        ),
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'has_archive' => true,
        'supports' => array( 'title','editor','excerpt','custom-fields','thumbnail' ),
        'rewrite' => array('slug' => 'artists','with_front' => false),
        'taxonomies' => array('large_feature','small_feature'),
        'capability_type' => 'post',
        'hierarchical' => false,
        'capabilities' => array(
            'publish_posts' => 'publish_artists',
            'edit_posts' => 'edit_artists',
            'edit_others_posts' => 'edit_others_artists',
            'delete_posts' => 'delete_artists',
            'delete_others_posts' => 'delete_others_artists',
            'read_private_posts' => 'read_private_artists',
            'edit_post' => 'edit_artists',
            'delete_post' => 'delete_artists',
            'read_post' => 'read_artists',
            'manage_categories' => 'manage_artist_categories',
        )
    ));
}
add_action('init','register_artists_post_type');

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

First off, @Wyck is right, it would be helpful to see your register_post_type code. If it were me, I’d make sure I had something like this in the $args array:

register_post_type( ... array(
    'capability_type' => 'artists',
    'map_meta_cap' => true
) );

Next, you don’t want to reset capabilities on every admin page load, that’s unnecessary work for your server. A simple trick I employ is to add ?reload_caps=1 after /wp-admin/ and check for that in my theme’s functions.php file. Here’s some code I used successfully on a site, modified to use the role artists_relations and capability type artists:

if ( is_admin() && '1' == $_GET['reload_caps'] ) {
    $administrator     = get_role('administrator');
    $artists_relations = get_role('artists_relations');

    $administrator->add_cap( 'assign_custom_taxes' );
    $artists_relations->add_cap( 'assign_custom_taxes' );

    foreach ( array('publish','delete','delete_others','delete_private','delete_published','edit','edit_others','edit_private','edit_published','read_private') as $cap ) {
        $administrator->add_cap( "{$cap}_artists" );
        $artists_relations->add_cap( "{$cap}_artists" );
    }
}


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x