Funzionalità e Tipi di Post Personalizzati
Ho un tipo di post personalizzato a cui vorrei limitare l'accesso a determinati ruoli, tuttavia, ho già aggiunto contenuti utilizzando il custom post type e ora devo renderli ristretti. Il capability_type era 'post'
'capability_type' => 'post'
Questo va bene poiché i contenuti vengono visualizzati nel backend, tuttavia, non appena aggiungo delle capabilities il contenuto scompare dal backend?
Ho provato a personalizzare il tipo di capability per includere definizioni plurali per costruire le mie, ma non appena rimuovo o cambio i tipi di capability, scompare!
codice completo:
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 );
}
Ho anche testato questo con un tipo di post personalizzato completamente nuovo e indipendentemente dal tipo di capability ottengo lo stesso problema, ad esempio anche se lo rimuovo e aggiungo il mio personalizzato:
'capability_type' => array('movie','movies');

Dopo una breve conversazione con Magicroundabout che mi ha segnalato una risorsa utile di Justin Tadlock, si scopre che le capability per i custom post type in realtà non esistono a meno che non si utilizzi add_cap per il ruolo, ad esempio per il seguente custom post type:
add_action( 'init', 'register_cpt_gallery' );
function register_cpt_gallery() {
$labels = array(
'name' => __( 'Galleries', 'gallery' ),
'singular_name' => __( 'Gallery', 'gallery' ),
'add_new' => __( 'Add New', 'gallery' ),
'add_new_item' => __( 'Add New Gallery', 'gallery' ),
'edit_item' => __( 'Edit Gallery', 'gallery' ),
'new_item' => __( 'New Gallery', 'gallery' ),
'view_item' => __( 'View Gallery', 'gallery' ),
'search_items' => __( 'Search Galleries', 'gallery' ),
'not_found' => __( 'No galleries found', 'gallery' ),
'not_found_in_trash' => __( 'No galleries found in Trash', 'gallery' ),
'parent_item_colon' => __( 'Parent Gallery:', 'gallery' ),
'menu_name' => __( 'Galleries', 'gallery' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'description' => 'Gallerie immagini per le classi degli insegnanti',
'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'
),
// come sottolineato da iEmanuele, aggiungendo map_meta_cap mapperà correttamente i meta
'map_meta_cap' => true
);
register_post_type( 'gallery', $args );
}
Le capability aggiuntive devono essere assegnate a un ruolo affinché i permessi funzionino effettivamente nel backend, incluso l' 'administrator' - ad esempio:
function add_theme_caps() {
// ottiene il ruolo administrator
$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');
Spero che questo possa essere utile ad altri.
Inoltre, la funzione di traduzione _x()
si aspetta che il secondo argomento sia string $context
, che è una breve descrizione, e il terzo sia string $domain
. Quando non si fornisce una descrizione, è meglio utilizzare la funzione di traduzione __()
che ha string $domain
come secondo argomento.

add_theme_caps()
dovrebbe essere chiamato una sola volta, non ogni volta che viene caricata una pagina di amministrazione. Sarebbe meglio usare switch_theme
come hook per l'attivazione del tema o register_activation_hook
per l'attivazione del plugin.

Aggiungi:
map_meta_cap => true
al tuo array $args. Guarda qui per maggiori informazioni. Spero ti sia utile!

IMHO non mappi mai le tue capacità. Assicurati di utilizzare il plugin map meta cap per farlo. http://codex.wordpress.org/Function_Reference/map_meta_cap
Ho passato giorni a cercare di mappare manualmente le mie capacità personalizzate con il codice. Basta installare quel plugin, mappare le tue capacità e disattivarlo una volta che funziona. Se crei ruoli personalizzati, avrai bisogno del plugin Members.
Il modo in cui testo per ASSICURARMI che il mio ruolo abbia quelle capacità (a volte pensi di averle ma in realtà non le hai) è creare una pagina di debug con:
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;
}
}
Questo ti mostrerà quali capacità hai effettivamente.

Per i Custom Post Types, NON consiglio di usare l'hook:
add_action( 'registered_post_type', 'your_func', 10, 2 );
invece consiglio di usare:
add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name )
{
if ( $name == "your_custom_post_name" )
...
}

Non capisco nemmeno perché sia un buon suggerimento. Quell'azione viene chiamata da post.php alla fine di register_post_type, e passa il tipo e l'oggetto a qualsiasi codice che voglia gestirla. Non sembra esserci nulla di sbagliato in questo. Anche se nulla in questa Q&A faceva riferimento a questa azione comunque. ;)
