Permettere l'accesso a un ruolo personalizzato per un custom post type nel backend
Sto avendo alcuni problemi con questo e non riesco a capire perché. Ho semplicemente bisogno che un ruolo personalizzato possa accedere al blog nel backend.
Ho aggiunto un nuovo post type con un Capability type blog
e un nuovo ruolo utente con tutte le capability necessarie per permettere agli amministratori di aggiungere/modificare il custom post type. Questo funziona per gli amministratori che possono accedere al post type nel backend. Tuttavia gli utenti con il mio ruolo personalizzato non riescono ad accedere affatto al backend.
Argomenti del post type rilevanti
"capability_type" => 'blog',
"map_meta_cap" => true,
Registrazione ruolo
function add_blog_manager_role(){
add_role(
'blog_manager',
'Gestore 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 );
Aggiunta Capability
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 );
Ho cercato freneticamente su Google per trovare la causa di questo problema. Ho provato con capability al plurale e al singolare, ho provato ad aggiungere capabilities direttamente negli argomenti del post type. Tuttavia non riesco mai ad accedere al backend. Non ho altro codice nel tema che potrebbe impedire l'accesso all'admin (ho rimosso il mio codice che bloccava l'accesso durante i test).
Modifica Ecco un dump delle capability di blog_manager dal database, c'è un po' di roba di test rimasta lì, ma questo non dovrebbe impedire loro di effettuare il login da quello che so.
'blog_manager' => array (
'name' => 'Gestore 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,
),
)

È difficile risolvere i problemi del codice sopra perché è solo una parte del codice effettivo, ma ecco il plugin minimo necessario per registrare un tipo di post personalizzato (chiamato Example) e un ruolo personalizzato (Blog Manager) che ha accesso al tipo di post personalizzato Example.
Questo può essere utilizzato anche come parte del file functions.php di un tema. Basta utilizzare gli hook di attivazione e disattivazione del tema invece.
<?php
/**
* Plugin Name: WPSE 186337
* Description: Debug WordPress StackExchange question 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
*/
//* Non accedere a questo file direttamente
defined( 'ABSPATH' ) or die();
//* Aggiungi azione a init per registrare il tipo di post personalizzato
add_action( 'init', 'se186337_init' );
//* Registra hook di attivazione per aggiungere il ruolo Blog Manager
register_activation_hook( __FILE__ , 'se186337_activation' );
//* Registra hook di disattivazione per rimuovere il ruolo Blog Manager
register_deactivation_hook( __FILE__ , 'se186337_deactivation' );
function se186337_activation() {
$caps = [
//* Capability meta
'read' => true,
'edit_blog' => true,
'read_blog' => true,
'delete_blog' => true,
//* Capability primitive utilizzate al di fuori di map_meta_cap()
'edit_blogs' => true,
'edit_others_blogs' => true,
'publish_blogs' => true,
'read_private_blogs' => true,
//* Capability primitive utilizzate all'interno di 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', 'Blog Manager', $caps );
}
function se186337_deactivation() {
remove_role( 'blog_manager' );
}
function se186337_init() {
$labels = [
'name' => __( 'Examples' ),
'singular_name' => __( 'Example' ),
];
$args = [
'labels' => $labels,
'public' => true,
'has_archive' => true,
'capability_type' => 'blog',
'map_meta_cap' => true,
];
register_post_type( 'examples', $args );
}

Se per te va bene utilizzare un plugin, puoi usare il seguente:
