Limitare i custom post type solo al ruolo di amministratore del sito
Come posso rimuovere questo custom post type dalla visualizzazione nel dashboard per gli utenti non amministratori?
/* Aggiungi il Custom Post Type per i Siti Web */
add_action( 'init', 'create_website_type' );
function create_website_type() {
register_post_type( 'website',
array(
'labels' => array(
'name' => __( 'Siti Web' ),
'singular_name' => __( 'Sito Web' ),
'add_new' => __( 'Aggiungi Nuovo Sito Web' ),
'add_new_item' => __( 'Aggiungi Nuovo Sito Web' ),
'edit' => __( 'Modifica Sito Web' ),
'edit_item' => __( 'Modifica Sito Web' ),
'new_item' => __( 'Aggiungi Nuovo Sito Web' ),
'view' => __( 'Visualizza Sito Web' ),
'view_item' => __( 'Visualizza Sito Web' ),
'search_items' => __( 'Cerca Siti Web' ),
'not_found' => __( 'Nessun Sito Web Trovato' ),
'not_found_in_trash' => __( 'Nessun Sito Web trovato nel Cestino' ),
),
'description' => __('Siti Web da mostrare nella sezione Risorse.'),
'public' => true,
'show_ui' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 20,
'supports' => array('title', 'editor'),
'can_export' => true
)
);
remove_post_type_support('website','editor');
}

register_post_type()
accetta un parametro capabilities
nei suoi argomenti. Vedi get_post_type_capabilities()
per i valori possibili. Dai commenti:
Di default, sette chiavi sono accettate come parte dell'array delle capabilities:
edit_post
,read_post
, edelete_post
sono meta capabilities, che vengono poi generalmente mappate alle corrispondenti primitive capabilities a seconda del contesto, che sarebbe il post in fase di modifica/lettura/cancellazione e l'utente o il ruolo controllato. Pertanto queste capabilities generalmente non vengono concesse direttamente agli utenti o ai ruoli.
edit_posts
- Controlla se gli oggetti di questo post type possono essere modificati.edit_others_posts
- Controlla se gli oggetti di questo tipo di proprietà di altri utenti possono essere modificati. Se il post type non supporta un autore, allora si comporterà comeedit_posts
.publish_posts
- Controlla la pubblicazione degli oggetti di questo post type.read_private_posts
- Controlla se gli oggetti privati possono essere letti.Queste quattro primitive capabilities sono controllate nel core in vari punti. Ci sono anche altre sette primitive capabilities che non sono referenziate direttamente nel core, eccetto in
map_meta_cap()
, che prende le tre meta capabilities menzionate sopra e le traduce in una o più primitive capabilities che devono poi essere controllate rispetto all'utente o al ruolo, a seconda del contesto.
read
- Controlla se gli oggetti di questo post type possono essere letti.delete_posts
- Controlla se gli oggetti di questo post type possono essere cancellati.delete_private_posts
- Controlla se gli oggetti privati possono essere cancellati.delete_published_posts
- Controlla se gli oggetti pubblicati possono essere cancellati.delete_others_posts
- Controlla se gli oggetti di proprietà di altri utenti possono essere cancellati. Se il post type non supporta un autore, allora si comporterà comedelete_posts
.edit_private_posts
- Controlla se gli oggetti privati possono essere modificati.edit_published_posts
- Controlla se gli oggetti pubblicati possono essere modificati.Queste capabilities aggiuntive sono usate solo in
map_meta_cap()
. Pertanto, vengono assegnate di default solo se il post type è registrato con l'argomento'map_meta_cap'
impostato atrue
(il default èfalse
).
Nei tuoi argomenti di registrazione aggiungi:
'capabilities' => array(
'edit_post' => 'update_core',
'read_post' => 'update_core',
'delete_post' => 'update_core',
'edit_posts' => 'update_core',
'edit_others_posts' => 'update_core',
'delete_posts' => 'update_core',
'publish_posts' => 'update_core',
'read_private_posts' => 'update_core'
),

Come faresti la stessa cosa ma consentendo agli amministratori e agli editori di accedere al CPT?

@drtanz Assegna a entrambi una capability personalizzata e filtra user_has_cap
. Vedi questa risposta per un esempio.

Potrei farlo nello stesso modo che hai suggerito, ma mettere la capability manage_links (condivisa tra amministratori e editori) invece di update_core?

@drtanz Sì, ma userei una capability personalizzata. Il link manager verrà rimosso prima o poi, e non sai cosa succederà alle capability assegnate in quel caso.

Ho provato a usare manage_categories ma ho ottenuto errori, stavo cercando di trovare alcune capability uniche per editor e amministratori da http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

Se si opta per una capability personalizzata, so come aggiungere la capability, ma non sono sicuro di quale tipo di filtro sia necessario per nascondere le voci di menu relative al CPT.

Per l'amministratore del Multi site è possibile utilizzare il seguente codice nel file functions.php:
/* Aggiungi un Custom Post Type per i Siti Web */
function create_website_CustomPostType() {
register_post_type( 'website',
array(
'labels' => array(
'name' => __( 'Siti Web' ),
'singular_name' => __( 'Sito Web' ),
'add_new' => __( 'Aggiungi Nuovo Sito Web' ),
'add_new_item' => __( 'Aggiungi Nuovo Sito Web' ),
'edit' => __( 'Modifica Sito Web' ),
'edit_item' => __( 'Modifica Sito Web' ),
'new_item' => __( 'Aggiungi Nuovo Sito Web' ),
'view' => __( 'Visualizza Sito Web' ),
'view_item' => __( 'Visualizza Sito Web' ),
'search_items' => __( 'Cerca Siti Web' ),
'not_found' => __( 'Nessun Sito Web Trovato' ),
'not_found_in_trash' => __( 'Nessun Sito Web trovato nel Cestino' ),
),
'description' => __('Siti Web da mostrare nella sezione Risorse.'),
'public' => true,
'show_ui' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'menu_position' => 20,
'supports' => array('title', 'editor'),
'can_export' => true
)
);
}
// Se l'utente è loggato come amministratore mostra il custom post type, altrimenti no
add_action( 'init', function(){
$WhatRoleUserLoginNow= wp_get_current_user()->caps;
$StatusAdmin=$WhatRoleUserLoginNow['administrator'] ?? null;
if( $StatusAdmin) {
create_website_CustomPostType();
}
} );
Il codice sopra aggiunge un custom post type a tutti gli utenti admin in modalità multisite
e super admin, mentre lo nasconde e lo rende inaccessibile per altri ruoli utente come autore, editore, ecc.
