Come abilitare un tipo di post personalizzato per un ruolo utente personalizzato in WordPress
Ho creato un tipo di post personalizzato chiamato Course Documents utilizzando il plugin WordPress Custom Post Type UI. Inoltre, ho creato un nuovo ruolo utente chiamato Teacher.
add_role('rpt_teacher',
'Insegnante',
array(
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
'publish_posts' => false,
'upload_files' => true,
)
);
E ora voglio abilitare il tipo di post personalizzato nel menu di navigazione della dashboard dell'insegnante. Ho utilizzato il codice seguente nel mio functions.php ma non succede nulla. Come posso risolvere il mio problema?
add_action('admin_init','rpt_add_role_caps',999);
/**
aggiungi capabilities per gli insegnanti
*/
function rpt_add_role_caps() {
// Aggiungi i ruoli che vorresti amministrare i tipi di post personalizzati
$roles = array('rpt_teacher','editor','administrator');
// Cicla attraverso ogni ruolo e assegna le capabilities
foreach($roles as $the_role) {
$role = get_role($the_role);
$role->add_cap( 'read' );
$role->add_cap( 'read_course_document');
$role->add_cap( 'edit_course_document' );
$role->add_cap( 'edit_course_documents' );
$role->add_cap( 'edit_published_course_documents' );
$role->add_cap( 'publish_course_documents' );
$role->add_cap( 'delete_published_course_documents' );
}
}

Non credo che il plugin aggiunga le capability che stai utilizzando in add_cap
durante la registrazione del post type.
Puoi modificare il post type registrato aggiungendo codice al file functions.php
del tema. Puoi fare qualcosa come questo.
/**
* Sovrascrivi gli argomenti del custom post type registrato dal plugin
*/
add_filter( 'register_post_type_args', 'change_capabilities_of_course_document' , 10, 2 );
function change_capabilities_of_course_document( $args, $post_type ){
// Non filtrare nessun altro post type
if ( 'course_document' !== $post_type ) {
// Restituisci gli argomenti originali agli altri post_type
return $args;
}
// Modifica le capabilities del post_type "course_document"
$args['capabilities'] = array(
'edit_post' => 'edit_course_document',
'edit_posts' => 'edit_course_documents',
'edit_others_posts' => 'edit_other_course_documents',
'publish_posts' => 'publish_course_documents',
'read_post' => 'read_course_document',
'read_private_posts' => 'read_private_course_documents',
'delete_post' => 'delete_course_document'
);
// Restituisci gli argomenti modificati al post_type course_document
return $args;
}
Poi puoi fare
/**
* Aggiungi le capability al ruolo teacher
*/
add_action('admin_init','rpt_add_role_caps',999);
function rpt_add_role_caps() {
$role = get_role('teacher');
$role->add_cap( 'read_course_document');
$role->add_cap( 'edit_course_document' );
$role->add_cap( 'edit_course_documents' );
$role->add_cap( 'edit_other_course_documents' );
$role->add_cap( 'edit_published_course_documents' );
$role->add_cap( 'publish_course_documents' );
$role->add_cap( 'read_private_course_documents' );
$role->add_cap( 'delete_course_document' );
}
Non è necessario aggiungere le capability ad administrator e editor perché il capability_type
è post
di default durante la registrazione di un Custom Post Type tramite questo plugin. Puoi cambiarlo, se preferisci avere un capability_type
personalizzato basato su altri post type.
Nota: Assicurati che Show in Menu
sia impostato su true
. Di default è true
in questo plugin.

Perfetto, grazie! Un problema che ho riscontrato:
"Se stai definendo un ruolo personalizzato e aggiungendo capacità al ruolo usando add_role(), tieni presente che modificare l'array delle capacità e rieseguire add_role() non aggiornerà necessariamente il ruolo con la nuova lista di capacità. La funzione add_role() interrompe l'esecuzione se il ruolo esiste già nel database. La soluzione alternativa in questo caso è precedere la tua chiamata add_role() con una chiamata remove_role() che punta al ruolo che stai aggiungendo." https://codex.wordpress.org/Function_Reference/add_role#Delete_existing_role

Dal mio punto di vista, sei sulla strada giusta. Hai creato un utente e gli hai assegnato nuove capacità. Ti è mancato solo di specificare che le nuove capacità verranno utilizzate per modificare il tuo custom post type.
Non ho mai utilizzato un plugin per creare un custom post type, quindi non sono sicuro di come farlo usando un plugin. Ma se vuoi creare il tuo CPT tramite codice puoi usare il seguente:
add_action( 'init', 'psp_register_cpt_projects');
function psp_register_cpt_projects() {
$args = array(
'label' => __( 'course_documents', 'course_documents' ),
'description' => __( 'Documento del corso', 'course_document' ),
'supports' => array( 'title', 'comments', 'revisions', ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'capability_type' => array('course_document','course_documents'),
'map_meta_cap' => true,
);
register_post_type( 'course_documents', $args );
}
Nota: Questo è solo un codice base per creare un CPT. Per favore leggi questa documentazione nel codex per comprenderlo a fondo.
Fammi sapere se questo ti è stato utile.

Ho appena permesso a tutti gli utenti di essere visualizzati nella selezione 'Autore':
add_filter( 'wp_dropdown_users_args', 'add_subscribers_to_dropdown', 10, 2 );
function add_subscribers_to_dropdown( $query_args, $r ) {
$query_args['who'] = '';
return $query_args;
}

Una sola cosa su cui ho speso un paio d'ore e vale la pena menzionare. Se hai capacità personalizzate e vuoi aggiornare le capacità di un ruolo personalizzato, non farlo nella funzione add_role.
Ad esempio, questo non aggiornerà il ruolo poiché esiste già:
$role = add_role(
'client',
'Client',
array(
'read' => true,
'edit_posts' => true,
'delete_posts' => false,
CAP_READ_ADDRESS => true,
CAP_DELETE_ADDRESS => true,
CAP_EDIT_OTHER_ADDRESSES => true,
CAP_READ_PRIVATE_ADDRESS => true,
CAP_EDIT_ADDRESSES => true,
CAP_PUBLISH_ADDRESS => true,
CAP_EDIT_ADDRESS => true
)
Dopo qualsiasi aggiornamento delle capacità, il mio ruolo "client" non verrà aggiornato poiché esiste già.
Il modo più sicuro per aggiungere capacità personalizzate a un ruolo personalizzato è ottenere il ruolo e aggiungerle dopo add_role
function addCaps() {
$role = get_role('client');
$role->add_cap(CAP_READ_ADDRESS, true);
$role->add_cap(CAP_EDIT_ADDRESSES, true);
}
add_action('admin_init', 'addCaps');
