Les autorisations de rôle de type de message personnalisé ne me permettent pas de lire

9

Je ne peux pas l'obtenir afin que mon rôle d'utilisateur pour un fournisseur puisse lire le type de publication des expéditions. Il apparaît dans leur menu, mais lorsque vous cliquez dessus, vous n'êtes pas autorisé à afficher ce message d'erreur de page .

Cela fonctionne si je add_cap('read_posts')mais je ne veux pas qu'ils voient les publications régulières uniquement le type de publication des expéditions.

J'ai un rôle d'utilisateur fournisseur avec les capacités suivantes.

WP_Role Object
(
    [name] => supplier
    [capabilities] => Array
        (
            [read] => 1
            [edit_shipment] => 1
            [read_shipment] => 1
            [edit_others_shipments] => 1
            [publish_shipments] => 1
            [read_private_shipments] => 1
            [edit_shipments] => 1
            [create_shipment] => 1
            [read_shipments] => 1
        )

)

Et j'ai configuré le type de message pour les envois avec les éléments suivants

function shipment_post_type() {
  $labels = array(
    'name'                  => _x( 'Shipments', 'Post Type General Name', 'sage' ),
    'singular_name'         => _x( 'Shipment', 'Post Type Singular Name', 'sage' ),
    'menu_name'             => __( 'Shipments', 'sage' ),
    'name_admin_bar'        => __( 'Shipments', 'sage' ),
    'archives'              => __( 'Shipment Archives', 'sage' ),
    'parent_item_colon'     => __( 'Parent shipment:', 'sage' ),
    'all_items'             => __( 'All shipments', 'sage' ),
    'add_new_item'          => __( 'Add New shipment', 'sage' ),
    'new_item'              => __( 'New shipment', 'sage' ),
    'edit_item'             => __( 'Edit shipment', 'sage' ),
    'update_item'           => __( 'Update shipment', 'sage' ),
    'view_item'             => __( 'View shipment', 'sage' ),
    'search_items'          => __( 'Search shipments', 'sage' ),
    'not_found'             => __( 'Not found', 'sage' ),
    'not_found_in_trash'    => __( 'Not found in Trash', 'sage' ),
    'featured_image'        => __( 'Featured Image', 'sage' ),
    'set_featured_image'    => __( 'Set shipment image', 'sage' ),
    'remove_featured_image' => __( 'Remove shipment image', 'sage' ),
    'use_featured_image'    => __( 'Use as shipment image', 'sage' ),
    'insert_into_item'      => __( 'Insert into shipment', 'sage' ),
    'uploaded_to_this_item' => __( 'Uploaded to this shipment', 'sage' ),
    'items_list'            => __( 'shipments list', 'sage' ),
    'items_list_navigation' => __( 'Constests list navigation', 'sage' ),
    'filter_items_list'     => __( 'Filter shipments list', 'sage' ),
  );
  $args = array(
    'label'                 => __( 'shipments', 'sage' ),
    'description'           => __( 'Manage all shipments, sweepstakes and giveaways.', 'sage' ),
    'labels'                => $labels,
    'supports'              => array( 'revisions' ),
    'taxonomies'            => array( '' ),
    'hierarchical'          => false,
    'public'                => true,
    'show_ui'               => true,
    'show_in_menu'          => true,
    'menu_position'         => 5,
    'menu_icon'             => 'dashicons-archive',
    'show_in_admin_bar'     => true,
    'show_in_nav_menus'     => false,
    'can_export'            => true,
    'has_archive'           => false,
    'exclude_from_search'   => true,
    'publicly_queryable'    => true,
    'map_meta_cap' => true,
    'capabilities' => array(
      'edit_post'          => 'edit_shipment',
      'read_post'          => 'read_shipment',
      'read_posts'         => 'read_shipments',
      'delete_post'        => 'delete_shipment',
      'delete_posts'       => 'delete_shipments',
      'edit_posts'         => 'edit_shipments',
      'edit_others_posts'  => 'edit_others_shipments',
      'publish_posts'      => 'publish_shipments',
      'read_private_posts' => 'read_private_shipments',
      'create_posts'       => 'create_shipments',
    ),
  );
  register_post_type( 'shipment', $args );

}
add_action( 'init', 'shipment_post_type', 0 );
Nicholas Koskowski
la source
Vérifiez cette solution: wordpress.stackexchange.com/a/108375/38771
PS
J'ai lu ceci plusieurs fois ... j'ai suivi les instructions tout ce que je pouvais faire. Obtenez toujours l'accès auquel vous n'êtes pas autorisé jusqu'à ce que j'accorde l'autorisation create_shipments.
Nicholas Koskowski
3
Pouvez-vous partager votre code où vous ajoutez le rôle add_role()et les majuscules add_cap()?
Mat
1
Essayez-vous de laisser le fournisseur lire ce type de message à l'avant ou à l'arrière?
Myles
Et ce code est-il dans un plugin ou un thème? Le plugin est meilleur, mais dans tous les cas, avec plus d'informations sur votre configuration, je suis sûr que je peux vous fournir une solution encore plus complète
Myles

Réponses:

4

Votre type de publication personnalisé semble avoir été correctement configuré. Cela fonctionne sur mon installation de test. Essayez ceci au lieu du code add_role et add_cap que vous utilisez actuellement. (À des fins de test uniquement. Ne l'utilisez pas dans le code de production, pour les raisons décrites ci-dessous.) Cela fonctionne pour moi:

function prefix_set_up_supplier_role(){
remove_role( 'supplier' );
add_role( 'supplier', 'Supplier', array(
        'read'                      => true,
        'edit_shipment'             => true,
        'read_shipment'             => true,
        'read_shipments'            => true,
        'delete_shipment'           => true,
        'delete_shipments'          => true,
        'edit_shipments'            => true,
        'edit_others_shipments'     => true,
        'publish_shipments'         => true,
        'read_private_shipments'    => true,
        'create_shipments'          => true,
    )
);
}
add_action( 'init', 'prefix_set_up_supplier_role' );

Il est très important de se rappeler que l'ajout de rôles et de capacités utilisateur enregistre en fait des données dans la base de données. Donc, si vous aviez une version de votre code auparavant qui ne fonctionnait pas tout à fait, puis que vous aviez ajouté quelque chose qui le ferait fonctionner, il se pourrait qu'elle ne prenne pas effet s'il y avait encore d'anciennes données dans votre base de données. add_role () renvoie null si le rôle existe déjà dans la base de données. Pour le code de production, vous devriez réellement utiliser les crochets d'activation et de désactivation du plugin pour ce genre de choses au lieu de l'exécuter à chaque fois, comme ceci:

register_activation_hook( __FILE__, 'prefix_activate' );
function prefix_activate(){
    add_role( 'supplier', 'Supplier', array(
        'read'                      => true,
        'edit_shipment'             => true,
        'read_shipment'             => true,
        'read_shipments'            => true,
        'delete_shipment'           => true,
        'delete_shipments'          => true,
        'edit_shipments'            => true,
        'edit_others_shipments'     => true,
        'publish_shipments'         => true,
        'read_private_shipments'    => true,
        'create_shipments'          => true,
    )
);
}

register_deactivation_hook( __FILE__, 'prefix_deactivate' );
function prefix_deactivate(){
    remove_role( 'supplier' );
}
Myles
la source
2
add_role()et remove_role()ne doit pas être exécuté dans chaque demande. Notez qu'une fois qu'un rôle est ajouté à la base de données, vous ne devez pas l'ajouter à nouveau. Habituellement, vous ajoutez register_activation_hooket supprimez des rôles sur register_deactivation_hook/ register_unistall_hook; à part cela, vous devez exécuter remove_role()/ add_role()uniquement si cela est vraiment nécessaire.
cybmeta
Je sais, et je l'ai également mentionné dans ma réponse. Mais cela peut toujours être un moyen rapide de diagnostiquer les problèmes de développement afin que vous n'ayez pas à cliquer sur désactiver, puis à activer chaque fois que vous apportez une modification au code. Ensuite, lorsque cela fonctionne, déplacez-le vers les crochets d'activation et de désactivation
Myles
1
@cybmeta C'est vrai. J'ai modifié ma réponse pour refléter comment les meilleures pratiques peuvent être suivies.
Myles
0

Dans votre objet de rôle, vous avez la capacité «create_shipment» où il devrait en fait dire «create_shipments». Il semble qu'il puisse y avoir un «s» manquant dans votre code où que vous ajoutiez cette capacité.

Myles
la source
0

Vous pourriez essayer:

add_action( 'init', 'add_my_caps');
function add_my_caps() {
    global $wp_roles;

    if ( isset($wp_roles) ) {
        $wp_roles->add_cap( 'editor', 'edit_shipment' );
        $wp_roles->add_cap( 'editor', 'read_shipment' );
        $wp_roles->add_cap( 'editor', 'delete_shipment' );
        $wp_roles->add_cap( 'editor', 'publish_shipments' );
        $wp_roles->add_cap( 'editor', 'edit_shipments' );
        $wp_roles->add_cap( 'editor', 'edit_others_shipments' );
        $wp_roles->add_cap( 'editor', 'delete_shipments' );
        $wp_roles->add_cap( 'editor', 'delete_others_shipments' );
        $wp_roles->add_cap( 'editor', 'read_private_shipments' );
        ....
T.Todua
la source
0

Essayez ceci. 'dms_document' est le type de publication personnalisé.

function jgd_add_role_caps() {
    // Add the roles you'd like to administer the custom post types
    $roles = array(
        'deity_user',
        'admin_user'
    );

    // Loop through each role and assign capabilities
    foreach($roles as $the_role) { 
        $role = get_role($the_role);

        $role->add_cap('read');
        $role->add_cap('read_dms_document');
        $role->add_cap('read_private_dms_documents');
        $role->add_cap('edit_dms_document');
        $role->add_cap('edit_dms_documents');
        $role->add_cap('edit_others_dms_documents');
        $role->add_cap('edit_published_dms_documents');
        $role->add_cap('publish_dms_documents');
        $role->add_cap('delete_others_dms_documents');
        $role->add_cap('delete_private_dms_documents');
        $role->add_cap('delete_dms_documents');
        $role->add_cap('delete_post_dms_documents');
        $role->add_cap('delete_published_dms_documents');
        $role->add_cap('delete_draft_dms_documents');
        $role->add_cap('delete_others_posts_dms_documents');
        $role->add_cap('delete_others_posts_dms_document');
        $role->add_cap('delete_posts_dms_documents');
        $role->add_cap('delete_posts_dms_document');
    }
}
add_action('admin_init','jgd_add_role_caps', 999);
James George Dunn
la source