Capacités et types de publication personnalisés

30

J'ai un type de publication personnalisé que j'aimerais restreindre l'accès à certains rôles, cependant, j'ai déjà ajouté du contenu en utilisant le type de publication personnalisé et maintenant je dois les restreindre. Le type de capacité était «post»

'capability_type' => 'post'

Ce qui est bien car le contenu apparaît dans le backend cependant, 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 les types de capacité, c'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é, j'obtiens le même problème, par exemple, même si je le supprime et que j'en ajoute un personnalisé:

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

Réponses:

40

Après une discussion rapide avec Magicroundabout qui a souligné une ressource utile de Justin Tadlock , il s'avère que les capacités pour les types de publication personnalisés n'existent réellement que si vous utilisez add_cap au 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 capacité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.

erichmond
la source
11
add_theme_caps()ne doit être appelé qu'une seule fois, pas à chaque fois qu'une page d'administration est chargée. Il serait préférable de l'utiliser switch_themecomme hook pour l'activation du thème ou pour l'activation register_activation_hookdu plugin.
d79
Agréable! J'aime utiliser wp cli pour ajouter les fonctionnalités si c'est un site complètement personnalisé / unique car c'est une action qui ne doit se produire qu'une seule fois.
squarecandy
8

Ajouter:

map_meta_cap => true

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

iEmanuele
la source
1
C'est ce que je pensais aussi mais pas totalement.
erichmond
Cela a fonctionné pour moi
Shikyo
1

À mon humble avis, 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 mes casquettes personnalisées manuellement avec du code. Installez simplement ce plugin, mappez vos bouchons et désactivez une fois que vous travaillez. Si vous créez des rôles personnalisés, vous aurez besoin du plugin Members .

La façon dont je teste pour 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 en fait.

Ben Racicot
la source
-1

Pour les types de publication personnalisés, je ne suggère PAS d' utiliser le crochet:

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

je suggère plutôt d'utiliser:

add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name ) 
{
   if ( $name == "your_custom_post_name" ) 
   ...
}
T.Todua
la source
la suggestion est bonne, mais elle ne répond pas à la question.
Aurovrata