web-dev-qa-db-fra.com

Appliquer les fonctionnalités de rôle personnalisé à l'administrateur (sans plugin)

J'ai un rôle personnalisé qui permet d'accéder uniquement à un type de publication personnalisé. C’est très bien, mais à présent, cela n’apparaît que pour ce rôle, pas pour admin et super admin. J'ai du mal à le faire apparaître dans le tableau de bord de l'administrateur.

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');

fonctionne très bien. J'ai essayé beaucoup de suggestions sur Internet, mais aucune n'a fonctionné. La dernière tentative, cependant, ressemblait à ceci

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');

J'ai lu quelques articles qui mentionnaient la suppression des filtres. Je ne comprends pas pourquoi cela fonctionnerait pour un nouveau rôle mais ne me laisse pas augmenter un rôle existant. Mais l'administrateur n'est-il pas censé avoir le droit de tout sans avoir à le spécifier de toute façon?

- EDIT - (en ajoutant un enregistrement de type de poste)

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');
3
kristina childs

Tout d’abord, @Wyck a raison, il serait utile de voir votre code register_post_type. Si c'était moi, je m'assurerais d'avoir quelque chose comme ceci dans le tableau $args:

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

Ensuite, vous ne voulez pas réinitialiser les fonctionnalités à chaque chargement de page d’administrateur, c’est un travail inutile pour votre serveur. Une astuce simple que j'utilise consiste à ajouter ?reload_caps=1 après /wp-admin/ et à vérifier cela dans le fichier functions.php de mon thème. Voici un code que j'ai utilisé avec succès sur un site, modifié pour utiliser le rôle artists_relations et le type de fonctionnalité 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" );
    }
}
3
Matthew Boynes