Capacités et types de publication personnalisés

26

J'ai un type de publication personnalisé pour lequel je souhaite limiter l'accès à certains rôles. Toutefois, j'ai déjà ajouté du contenu à l'aide du type de publication personnalisé et je dois maintenant le rendre restreint. Le type de capacité était 'post'

'capability_type' => 'post'

Qu'est-ce qui convient si le contenu s'affiche dans le backend, dès que j'ajoute des fonctionnalités, le contenu disparaît du backend?

J'ai essayé de personnaliser le type de capacité pour inclure plusieurs définitions afin de construire la mienne, mais dès que je supprime ou modifie des types de capacité, tout est parti!

code complet:

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),

    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,

    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    )
);

register_post_type( 'gallery', $args );
}

J'ai également testé cela avec un tout nouveau type de message personnalisé et quel que soit le type de capacité, le même problème se pose, par exemple, même si je le supprime et que j'ajoute mon type personnalisé:

'capability_type' => array('movie','movies');
    
posée erichmond 30.07.2013 - 16:20
la source

3 réponses

32

Après une discussion rapide avec Magicroundabout , qui a signalé une ressource utile provenant de Justin Tadlock , il s'avère que les capacités de personnalisation Les types de publication n'existent pas à moins d'utiliser add_cap dans le rôle, par exemple pour le type de publication personnalisé suivant:

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    ),
    // as pointed out by iEmanuele, adding map_meta_cap will map the meta correctly 
    'map_meta_cap' => true
);

register_post_type( 'gallery', $args );
}

les fonctionnalités supplémentaires doivent être ajoutées à un rôle pour que les autorisations fonctionnent réellement dans le backend, y compris "l'administrateur" - par exemple:

function add_theme_caps() {
    // gets the administrator role
    $admins = get_role( 'administrator' );

    $admins->add_cap( 'edit_gallery' ); 
    $admins->add_cap( 'edit_galleries' ); 
    $admins->add_cap( 'edit_other_galleries' ); 
    $admins->add_cap( 'publish_galleries' ); 
    $admins->add_cap( 'read_gallery' ); 
    $admins->add_cap( 'read_private_galleries' ); 
    $admins->add_cap( 'delete_gallery' ); 
}
add_action( 'admin_init', 'add_theme_caps');

J'espère que cela sera utile aux autres.

    
réponse donnée erichmond 30.07.2013 - 22:24
la source
7

Ajouter:

map_meta_cap => true

à votre tableau $ args. Regardez ici pour plus d'informations. J'espère que ça aide!

    
réponse donnée iEmanuele 30.07.2013 - 19:39
la source
1

IMHO vous ne cartographiez jamais vos propres capacités. Assurez-vous d'utiliser le plugin map meta cap pour le faire. enlace

J'ai passé des jours à essayer de mapper manuellement mes majuscules avec du code. Installez simplement ce plugin, mappez vos majuscules et désactivez-les lorsque vous travaillez. Si vous créez des rôles personnalisés, vous aurez besoin du plugin Members .

La façon dont je teste pour m'ASSURER que mon rôle possède ces capacités (parfois, vous jurez que vous le faites mais ne le faites pas réellement) crée une page de débogage avec:

    if( !function_exists( 'current_user_has_role' ) ){
        function current_user_has_role( $role ){
            $current_user = new WP_User( wp_get_current_user()->ID );
            $user_roles = $current_user->roles;
            $is_or_not = in_array( $role, $user_roles );
            return $is_or_not;
        }
    }

Cela vous indiquera quelles fonctionnalités vous avez réellement.

    
réponse donnée TR3B 30.07.2013 - 23:56
la source

Lire d'autres questions sur les étiquettes