web-dev-qa-db-fra.com

Capacités de type de message personnalisé

J'ai un type d'article personnalisé que je veux que les auteurs puissent éditer d'autres articles, mais pas capable d'en supprimer d'autres. Mon code comme suit:

$labels = array(
    'name'          => __( 'Book', 'textdomain' ),
    'singular_name' => __( 'Book', 'textdomain' ),
    'menu_name'     => __( 'Books', 'textdomain' ),
    'add_new'       => __( 'New book', 'textdomain' ),
    'add_new_item'  => __( 'New book', 'textdomain' ),
    'edit_item'     => __( 'Edit book', 'textdomain' ),
);
$args = array(
    'labels'        => $labels,
    'public'        => true,
    'menu_position' => 6,
    'menu_icon'     => 'dashicons-book',
    'has_archive'   => true,
    'supports'      => array( 'title', 'author' ),
    'capabilities'  => array(
        'edit_post'             => 'edit_posts',
        'read_post'             => 'edit_posts',
        'delete_post'           => 'edit_posts',
        'edit_posts'            => 'edit_posts',
        'edit_others_posts'     => 'edit_posts',
        'publish_posts'         => 'edit_posts',
        'read_private_posts'    => 'edit_others_posts',
        'delete_others_posts'   => 'edit_others_posts',
    ),
);
register_post_type( 'book', $args );

Ce que je rencontre avec le code ci-dessus est:

  1. Lorsque 'edit_others_posts' => 'edit_posts', l'onglet "mine" dans la liste des éditeurs postérieurs de l'administrateur n'apparaît pas et je souhaite qu'il soit toujours affiché. Est-il possible de le forcer?
  2. Même si 'delete_others_posts' => 'edit_others_posts' (les utilisateurs auteurs ne sont pas en mesure de 'modifier_autres_posts'), les auteurs peuvent supprimer d'autres publications.
  3. Si je modifie le code ci-dessus avec 'edit_others_posts' => 'edit_others_posts', l'onglet "mine" s'affiche, mais les utilisateurs auteurs peuvent toujours modifier d'autres publications, ce qui me trouble.

Je ne sais vraiment pas si j'utilise les fonctionnalités de la bonne manière ou si ce que je compte faire est possible. Merci d'avance.

1
vguerrero

Ok, essayons encore une fois :)

J'ai ajouté le paramètre map_meta_cap qui est nécessaire pour que delete_others_posts fonctionne. Maintenant, je pouvais demander aux auteurs d'éditer et de voir tous les articles, mais seulement de supprimer les leurs.

$labels = array(
    'name'          => __( 'Book', 'textdomain' ),
    'singular_name' => __( 'Book', 'textdomain' ),
    'menu_name'     => __( 'Books', 'textdomain' ),
    'add_new'       => __( 'New book', 'textdomain' ),
    'add_new_item'  => __( 'New book', 'textdomain' ),
    'edit_item'     => __( 'Edit book', 'textdomain' ),
);
$args = array(
    'labels'        => $labels,
    'public'        => true,
    'menu_position' => 6,
    'menu_icon'     => 'dashicons-book',
    'has_archive'   => true,
    'supports'      => array( 'title', 'author' ),
    'map_meta_cap'  => true,
    'capabilities'  => array(
        'read_post' => 'read_post',
        'edit_post' => 'edit_posts',
        'edit_posts' => 'edit_posts',
        'edit_others_posts'     => 'edit_posts',
        'delete_others_posts'   => 'install_plugins',
    )

);
register_post_type( 'book', $args );
1
Welcher