Cum să activezi un tip de postare personalizat pentru un rol de utilizator personalizat în WordPress

4 ian. 2018, 06:42:04
Vizualizări: 23.4K
Voturi: 5

Am creat un tip de postare personalizat numit Course Documents folosind plugin-ul WordPress Custom Post Type UI. De asemenea, am creat un nou rol de utilizator numit Teacher.

add_role('rpt_teacher',
            'Teacher',
            array(
                'read' => true,
                'edit_posts' => false,
                'delete_posts' => false,
                'publish_posts' => false,
                'upload_files' => true,
            )
        );

Și acum vreau să activez tipul de postare personalizat în meniul de navigare din panoul de control al profesorului. Am folosit codul de mai jos în functions.php dar nu se întâmplă nimic. Cum pot rezolva această problemă?

add_action('admin_init','rpt_add_role_caps',999);
    /**
    adaugă capacitățile profesorilor
    */
    function rpt_add_role_caps() {

        // Adaugă rolurile care dorești să administreze tipurile de postări personalizate
        $roles = array('rpt_teacher','editor','administrator');

        // Parcurge fiecare rol și atribuie capacitățile
        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
Toate răspunsurile la întrebare 4
1
15

Nu cred că plugin-ul adaugă capabilitățile pe care le folosești în add_cap la înregistrarea tipului de postare.

Poți modifica tipul de postare înregistrat prin adăugarea de cod în fișierul functions.php al temei. Poți face ceva de genul acesta.

/**
 * Suprascrie argumentele tipului de postare personalizat înregistrat de plugin
 */
add_filter( 'register_post_type_args', 'change_capabilities_of_course_document' , 10, 2 );

function change_capabilities_of_course_document( $args, $post_type ){

 // Nu filtra orice alt tip de postare
 if ( 'course_document' !== $post_type ) {

     // Returnează argumentele originale pentru alte tipuri de postări
     return $args;

 }

 // Modifică capabilitățile tipului de postare "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'
        );

  // Returnează argumentele pentru tipul de postare course_document
  return $args;

}

Apoi poți face

/**
Adaugă capabilitățile pentru profesori
*/
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' );


}

Nu este nevoie să adaugi capabilități pentru administrator și editor deoarece capability_type este implicit setat la post la înregistrarea Tipurilor Personalizate de Postare prin acest plugin. Poți modifica acest lucru, dacă preferi să ai un capability_type personalizat bazat pe alt tip de postare.

Notă: Asigură-te că Show in Menu este setat la true. În mod implicit, este true în acest plugin.

4 ian. 2018 08:25:52
Comentarii

Perfect, mulțumesc! Un aspect la care trebuie să fii atent:

"Dacă definești un rol personalizat și adaugi capabilități folosind add_role(), fii conștient că modificarea array-ului de capabilități și re-executarea add_role() nu va actualiza neapărat rolul cu noua listă de capabilități. Funcția add_role() se oprește dacă rolul există deja în baza de date. Soluția în acest caz este să precedi apelul tău add_role() cu un apel remove_role() care țintește rolul pe care îl adaugi." https://codex.wordpress.org/Function_Reference/add_role#Delete_existing_role

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

După cum văd eu, sunteți pe drumul cel bun. Ați creat un utilizator și i-ați atribuit noi capabilități. Doar că ați omis să specificați că noile capabilități vor fi folosite pentru a edita tipul personalizat de postare.

Nu am folosit niciodată un plugin pentru a crea un tip personalizat de postare, așa că nu sunt sigur cum să fac asta folosind un plugin. Dar dacă doriți să vă creați CPT prin cod, puteți utiliza următoarele:

add_action( 'init', 'psp_register_cpt_projects');
function psp_register_cpt_projects() {
     $args = array(
 'label'               => __( 'course_documents', 'course_documents' ),
 'description'         => __( 'Course document', '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 );
}

Notă: Acesta este doar un cod de bază pentru crearea unui CPT. Vă rugăm să citiți acest document din codex pentru a-l înțelege în profunzime.

Anunțați-mă dacă vă ajută.

4 ian. 2018 07:17:17
Comentarii

Da. Când creez un tip de postare personalizată, folosesc sugestia ta. Dar în acest proiect există multe tipuri de postări personalizate create de alt dezvoltator și nu vreau să le rescriu pe toate așa cum ai menționat mai sus.

ashanrupasinghe ashanrupasinghe
4 ian. 2018 12:03:10
0

Tocmai am permis tuturor utilizatorilor să apară în selecția 'Autor':

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 ian. 2020 13:53:48
0

Un lucru pe care l-am descoperit după ce am pierdut câteva ore și merită menționat. Dacă ai capabilități personalizate și vrei să actualizezi capabilitățile unui rol personalizat, nu face asta în funcția add_role.

De exemplu, acest cod nu va actualiza rolul deoarece acesta există deja:

    $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
        )

După orice actualizare a capabilităților, rolul meu de "client" nu se va actualiza deoarece există deja.

Cea mai sigură metodă de a adăuga capabilități personalizate unui rol este să obții rolul și să le adaugi după 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 dec. 2021 13:05:16