web-dev-qa-db-fra.com

Autoriser l'accès de rôle personnalisé au type de publication personnalisé en back-end

Donc, j'ai quelques problèmes avec cela et je ne vois pas pourquoi. J'ai juste besoin d'un rôle personnalisé pouvant accéder au blog dans le back-end.

J'ai ajouté un nouveau type de publication avec un type de capacité de type blog et un nouveau rôle d'utilisateur avec toutes les majuscules qui autoriseraient les utilisateurs ayant un accès administrateur à ajouter/modifier le type de publication personnalisé. Cela fonctionne pour les administrateurs et ils peuvent accéder au type de message dans le back-end. Cependant, les utilisateurs de mon rôle personnalisé ne peuvent absolument pas accéder au serveur principal.

Post type args of note

"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 été googler frénétiquement à la recherche de la cause de cela. J'ai essayé avec des majuscules plurielles et non plurielles, j'ai essayé d'ajouter des fonctionnalités dans les arguments de type publication. Cependant, je ne pourrai jamais entrer dans le back-end. Je n'ai pas d'autre code dans le thème qui puisse expulser les utilisateurs de l'administrateur (j'ai supprimé mon propre code qui les a expulsés lors du test)

Edit Vous pouvez voir ici un vidage des capacités de blog_manager de la base de données. Il reste encore un peu de BS à tester, 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,
    ),
)
8
Chris Morris

Il est difficile de dépanner le code ci-dessus, car il ne s'agit que d'une partie du code lui-même, mais voici le plug-in minimum nécessaire pour enregistrer un type de publication personnalisé (appelé Example) et un rôle personnalisé (Gestionnaire de blog) ayant accès au type de publication personnalisé Example. .

Cela peut également être utilisé dans le fichier functions.php du 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: https://wordpress.stackexchange.com/questions/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 );
}
3
Nathan Johnson

Si vous êtes d'accord avec le plugin, vous pouvez utiliser le plugin Velow.

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

0
Aki