Cum să activezi un tip de postare personalizat pentru un rol de utilizator personalizat în WordPress
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' );
}
}

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.

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

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ă.

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');
