Autoriser l'accès au rôle personnalisé au type de publication personnalisé dans le backend

8

J'ai donc des problèmes avec ça et je ne vois pas pourquoi. J'ai juste besoin d'un rôle personnalisé qui peut accéder au blog à l'arrière.

J'ai ajouté un nouveau type de publication avec un type de capacité bloget un nouveau rôle d'utilisateur avec toutes les majuscules pour permettre aux utilisateurs ayant un accès administrateur d'ajouter / modifier le type de publication personnalisé. Cela fonctionne pour les administrateurs et ils peuvent accéder au type de publication dans le back-end. Cependant, les utilisateurs de mon rôle personnalisé ne peuvent pas du tout accéder au back-end.

Type d'argument à noter

"capability_type" => 'blog',
"map_meta_cap" => true,

Enregistrer le rôle

function add_blog_manager_role(){
    add_role(
        'blog_manager',
        'Blog Manager',
        array(
            'read' => true,
            'edit_posts' => false,
            'delete_posts' => false,
            'publish_posts' => false,
            'upload_files' => true
        )
    );
}
add_action( 'admin_init', 'add_blog_manager_role', 4 );

Ajouter des bouchons

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

J'ai googlé frénétiquement en essayant de trouver la cause de cela. J'ai essayé avec des majuscules plurielles et non plurielles, j'ai essayé d'ajouter des capacités dans les arguments de type de message. Mais je ne parviens jamais à entrer dans le back-end. Je n'ai pas d'autre code dans le thème qui pourrait expulser les utilisateurs de l'administrateur (j'ai supprimé mon propre code qui les a expulsés pendant le test)

Modifier Ici, vous pouvez voir un vidage des capacités de blog_manager de la base de données, il y a pas mal de tests BS laissés là-dedans, mais cela ne devrait pas les empêcher de se connecter à partir de ce que je sais.

'blog_manager' => array (
    'name' => 'Blog Manager',
    '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,
    ),
)
Chris Morris
la source
1
Notez que les rôles et les capacités sont constamment enregistrés. Si vous aviez une version antérieure de cela qui ne permettait pas l'accès, elle pourrait toujours être là dans le cadre du rôle. Videz les données persistantes et voyez s'il y a quelque chose qui ne devrait pas l'être.
Rarst
J'ai ajouté un vidage des capacités de la base de données. Je n'ai que les 3 capacités de post sur false que j'ai dans le code ci-dessus.
Chris Morris
J'installerais le plugin User Role Editor - wordpress.org/plugins/user-role-editor . Ensuite, inspectez manuellement les différences entre les utilisateurs / rôles - il peut y avoir quelque chose de conflictuel ou manquant.
Welcher
Bonjour @ChrisMorris, comment en êtes-vous arrivé là? Avez-vous fini par trouver une solution?
Tim Malone

Réponses:

3

Il est difficile de dépanner le code ci-dessus car il ne s'agit que d'une partie du code réel, mais voici le plugin minimum nécessaire pour enregistrer un type de publication personnalisé (appelé Exemple) et un rôle personnalisé (Blog Manager) qui a accès à l'Exemple de type de publication personnalisé .

Cela peut également être utilisé dans le cadre du fichier functions.php d'un thème. Utilisez simplement les crochets d'activation et de désactivation du thème à la place.

<?php
/**
 * Plugin Name: WPSE 186337
 * Description: Debug WordPress StackExchange question 186337
 * Plugin URI: /wordpress/186337/
 * Author: Nathan Johnson
 * Licence: GPL2+
 * Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
 */

//* Don't access this file directly
defined( 'ABSPATH' ) or die();

//* Add action to init to register custom post type
add_action( 'init', 'se186337_init' );

//* Register activation hook to add Blog Manager role
register_activation_hook( __FILE__ , 'se186337_activation' );

//* Register deactivation hook to remove Blog Manager role
register_deactivation_hook( __FILE__ , 'se186337_deactivation' );

function se186337_activation() {
  $caps = [
    //* Meta capabilities
    'read'                   => true,
    'edit_blog'              => true,
    'read_blog'              => true,
    'delete_blog'            => true,

    //* Primitive capabilities used outside of map_meta_cap()
    'edit_blogs'             => true,
    'edit_others_blogs'      => true,
    'publish_blogs'          => true,
    'read_private_blogs'     => true,

    //* Primitive capabilities used within of 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 );
}
Nathan Johnson
la source