Come abilitare un tipo di post personalizzato per un ruolo utente personalizzato in WordPress

4 gen 2018, 06:42:04
Visualizzazioni: 23.4K
Voti: 5

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' );
        }
        }
0
Tutte le risposte alla domanda 4
1
15

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.

4 gen 2018 08:25:52
Commenti

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

00-BBB 00-BBB
23 mag 2019 19:02:57
1

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.

4 gen 2018 07:17:17
Commenti

Sì. Quando creo un custom post type utilizzo il tuo suggerimento. Ma in questo progetto ci sono molti custom post type creati da un altro sviluppatore e non voglio riscriverli tutti come indicato sopra.

ashanrupasinghe ashanrupasinghe
4 gen 2018 12:03:10
0

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;
}
3 gen 2020 13:53:48
0

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');
1 dic 2021 13:05:16