web-dev-qa-db-fra.com

Capacités et types de publication personnalisés

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 les restreindre. Le type de capacité était 'post'

'capability_type' => 'post'

Ce qui est bien, car le contenu apparaît 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 type de message personnalisé complètement nouveau 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 je l'ajoute:

'capability_type' => array('movie','movies');
27
erichmond

Après une brève discussion avec Magicroundabout qui a indiqué une ressource utile de Justin Tadlock , il s’avère que les fonctionnalités pour les types de publication personnalisés n’existent pas, à moins d’utiliser add_cap dans le rôle, par exemple pour type de message 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 est utile aux autres.

36
erichmond

Ajouter:

map_meta_cap => true

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

7
iEmanuele

IMHO vous ne cartographiez jamais vos propres capacités. Assurez-vous d'utiliser le plugin map meta cap pour le faire. http://codex.wordpress.org/Function_Reference/map_meta_cap

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

La façon dont je teste pour m'ASSURER que mon rôle a 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 montrera quelles capacités vous avez réellement.

1
Ben Racicot

Pour les types de publication personnalisés, I DON'T suggère d'utiliser hook:

add_action( 'registered_post_type', 'your_func', 10, 2 );

à la place, je suggère d'utiliser:

add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name ) 
{
   if ( $name == "your_custom_post_name" ) 
   ...
}
0
T.Todua