Cum să permiți accesul unui rol personalizat la un tip de postare personalizat în backend
Am o problemă cu acest lucru și nu înțeleg de ce. Am nevoie doar ca un rol personalizat să poată accesa blogul în backend.
Am adăugat un nou tip de postare cu un Capability type blog
și un nou rol de utilizator cu toate capabilitățile necesare pentru a permite administratorilor să adauge/modifice tipul de postare personalizat. Acest lucru funcționează pentru administratori și ei pot accesa tipul de postare în backend. Totuși, utilizatorii cu rolul meu personalizat nu pot intra deloc în backend.
Argumentele importante pentru tipul de postare
"capability_type" => 'blog',
"map_meta_cap" => true,
Înregistrarea rolului
function add_blog_manager_role(){
add_role(
'blog_manager',
'Manager Blog',
array(
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
'publish_posts' => false,
'upload_files' => true
)
);
}
add_action( 'admin_init', 'add_blog_manager_role', 4 );
Adăugarea capabilităților
function add_blog_role_caps() {
$roles = array('blog_manager', 'editor','administrator');
foreach($roles as $the_role) {
$role = get_role($the_role);
$role->add_cap( 'read' );
$role->add_cap( 'read_blog');
$role->add_cap( 'read_private_blog' );
$role->add_cap( 'edit_blog' );
$role->add_cap( 'edit_others_blog' );
$role->add_cap( 'edit_published_blog' );
$role->add_cap( 'publish_blog' );
$role->add_cap( 'delete_others_blog' );
$role->add_cap( 'delete_private_blog' );
$role->add_cap( 'delete_published_blog' );
}
}
add_action('admin_init', 'add_blog_role_caps', 5 );
Am căutat intens pe Google pentru a găsi cauza acestei probleme. Am încercat cu capabilități la plural, neplural, am încercat să adaug capabilități în argumentele tipului de postare. Dar niciodată nu pot intra în backend. Nu am alte coduri în temă care ar putea scoate utilizatorii din admin (am eliminat propriul meu cod care îi excludea în timp ce testam asta).
Editare Aici puteți vedea un dump al capabilităților blog_manager din baza de date, există o grămadă de teste BS rămase acolo, dar asta nu ar trebui să le împiedice să se autentifice din câte știu eu.
'blog_manager' => array (
'name' => 'Manager Blog',
'capabilities' => array (
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
'publish_posts' => false,
'upload_files' => true,
'read_blog' => true,
'read_private_blog' => true,
'edit_blog' => true,
'edit_others_blog' => true,
'edit_published_blog' => true,
'publish_blog' => true,
'delete_others_blog' => true,
'delete_private_blog' => true,
'delete_published_blog' => true,
'blog' => true,
'read_private_blogs' => true,
'edit_blogs' => true,
'edit_others_blogs' => true,
'edit_published_blogs' => true,
'publish_blogs' => true,
'delete_others_blogs' => true,
'delete_private_blogs' => true,
'delete_published_blogs' => true,
'delete_blogs' => true,
'delete_blog' => true,
),
)

Este dificil să depanezi codul de mai sus deoarece este doar o parte din codul real, dar iată pluginul minim necesar pentru a înregistra un tip de postare personalizat (numit Exemplu) și un rol personalizat (Manager de Blog) care are acces la tipul de postare personalizat Exemplu.
Acesta poate fi folosit și ca parte a fișierului functions.php al unei teme. Doar folosește hook-urile de activare și dezactivare a temei în loc.
<?php
/**
* Plugin Name: WPSE 186337
* Description: Depanare întrebare WordPress StackExchange 186337
* Plugin URI: https://wordpress.stackexchange.com/questions/186337/
* Author: Nathan Johnson
* Licence: GPL2+
* Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
*/
//* Nu accesa acest fișier direct
defined( 'ABSPATH' ) or die();
//* Adaugă acțiune la init pentru a înregistra tipul de postare personalizat
add_action( 'init', 'se186337_init' );
//* Înregistrează hook-ul de activare pentru a adăuga rolul Manager de Blog
register_activation_hook( __FILE__ , 'se186337_activation' );
//* Înregistrează hook-ul de dezactivare pentru a elimina rolul Manager de Blog
register_deactivation_hook( __FILE__ , 'se186337_deactivation' );
function se186337_activation() {
$caps = [
//* Capabilități meta
'read' => true,
'edit_blog' => true,
'read_blog' => true,
'delete_blog' => true,
//* Capabilități primitive folosite în afara map_meta_cap()
'edit_blogs' => true,
'edit_others_blogs' => true,
'publish_blogs' => true,
'read_private_blogs' => true,
//* Capabilități primitive folosite în interiorul map_meta_cap()
'delete_blogs' => true,
'delete_private_blogs' => true,
'delete_published_blogs' => true,
'delete_others_blogs' => true,
'edit_private_blogs' => true,
'edit_published_blogs' => true,
];
add_role( 'blog_manager', 'Manager de Blog', $caps );
}
function se186337_deactivation() {
remove_role( 'blog_manager' );
}
function se186337_init() {
$labels = [
'name' => __( 'Exemple' ),
'singular_name' => __( 'Exemplu' ),
];
$args = [
'labels' => $labels,
'public' => true,
'has_archive' => true,
'capability_type' => 'blog',
'map_meta_cap' => true,
];
register_post_type( 'examples', $args );
}

Dacă sunteți de acord cu un plugin, atunci puteți utiliza plugin-ul de mai jos.
