Permettere l'accesso a un ruolo personalizzato per un custom post type nel backend

5 mag 2015, 14:01:43
Visualizzazioni: 18.3K
Voti: 10

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,
    ),
)
4
Commenti

Nota che i ruoli e le capacità vengono salvati in modo persistente. Se avevi una versione precedente di questo codice che non permetteva l'accesso, potrebbe essere ancora presente come parte del ruolo. Esporta i dati persistenti e verifica se ci sono impostazioni che non dovrebbero esserci.

Rarst Rarst
5 mag 2015 17:32:31

Ho aggiunto un dump delle capacità del database. Ho solo impostato a false le 3 capacità relative ai post che ho nel codice sopra.

Chris Morris Chris Morris
5 mag 2015 17:54:49

Installerei il plugin User Role Editor - https://wordpress.org/plugins/user-role-editor/. Poi controllerei manualmente le differenze tra utenti/ruoli - potrebbe esserci qualche conflitto o elemento mancante.

Welcher Welcher
21 mag 2015 02:50:29

Ciao @ChrisMorris, come è andata con questo problema? Alla fine sei riuscito a trovare una soluzione?

Tim Malone Tim Malone
29 giu 2016 11:18:05
Tutte le risposte alla domanda 2
1

È 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 );
}
21 feb 2017 20:22:16
Commenti

nella funzione se186337_activation() hai assegnato le capacità, tuttavia perché non hai utilizzato la funzione $add->cap da usare all'interno di un'altra funzione con un ciclo foreach per aggiungere le capacità in quel modo? spero che abbia senso...

Krys Krys
22 mar 2022 08:08:09
0

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

https://wordpress.org/plugins/capability-manager-enhanced/

7 ago 2016 01:02:05