web-dev-qa-db-fra.com

Pourquoi ma coutume WP role need edit_posts pour éditer les images?

Cela peut être évident pour quelqu'un d'autre que moi. Je pense me rappeler avoir lu quelque part qu'une "image" est bien une forme de "post".

  • J'ai un type de message personnalisé appelé "liste"
  • J'ai un rôle personnalisé WP de "client"

Lorsque je suis connecté en tant que "client" et que je lance la fenêtre contextuelle du média, naviguez jusqu'à une image, cliquez sur "montrer" pour l'ouvrir, puis cliquez sur "éditer l'image" pour obtenir -1. C'est à dire. rien d'autre ne s'affiche sauf "-1".

Je peux résoudre ce problème en attribuant à mon rôle personnalisé la fonction "edit_posts". Pourquoi est-ce? Dès que je fais cela, je suis aux prises avec un autre problème: le rôle d'utilisateur "client" a désormais accès à des publications, des commentaires et des outils, ce que je ne souhaite pas.

Peut-être que je n'ai pas configuré correctement mon type d'article personnalisé avec les fonctionnalités? Comment puis-je autoriser le "client" à modifier les images sans avoir accès aux publications?

      $args = array(
    'label' => 'Listing',
    'description' => '',
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'show_in_nav_menus' => true,
    'map_meta_cap' => true,
    'capability_type' => 'listing',
    'capabilities' => array(
                    'edit_post' => 'edit_listing',
                    'read_post' => 'read_listing',
                    'delete_post' => 'delete_listing',
                    'edit_posts' => 'edit_listings',
                    'edit_others_posts' => 'edit_others_listings',
                    'publish_posts' => 'publish_listings',
                    'read_private_posts' => 'read_private_listings',
                    'delete_posts' => 'delete_listings',
                    'delete_private_posts' => 'delete_private_listings',
                    'delete_published_posts' => 'delete_published_listings',
                    'delete_others_posts' => 'delete_others_listings',
                    'edit_private_posts' => 'edit_private_listings',
                    'edit_published_posts' => 'edit_published_listings',
                ),
    'menu_position' => 5, 
    'hierarchical' => false,
    'has_archive' => false, 
    'rewrite' => array('slug' => 'listing'), 
    'query_var' => true,
    'supports' => array('title'),
    'labels' => $labels
  ); 
7
Andrew

Si je devais deviner: parce que images are Pièces jointes et Pièces jointes sont un Post-Type . Ainsi, pour éditer une image, qui est une pièce jointe, qui est une publication, il faut la capacité edit_post.

MODIFIER

N'avez-vous pas vos capability clés/valeurs de tableau de mappage inversées?

par exemple. vous avez 'edit_posts' => 'edit_listings'. Ne devrait-il pas être plutôt 'edit_listings' => 'edit_posts'?

0
Chip Bennett

Je sais que cette question a maintenant un an, mais je viens de découvrir qu'il existe un moyen d'y parvenir. Publiez-la ici au cas où elle serait utile à d'autres personnes:

add_filter( 'user_has_cap', 'my_user_has_cap', 10, 3 );

function my_user_has_cap( $user_caps, $req_cap, $args ) {

    $post = get_post( $args[2] );

    if ( 'attachment' != $post->post_type )
        return $user_caps;

    if ( 'delete_post' == $args[0] ) {

        if ( $user_caps['delete_others_posts'] )
            return $user_caps;

        if ( !isset( $user_caps['delete_others_listings'] ) or !$user_caps['delete_others_listings'] )
            return $user_caps;

        $user_caps[$req_cap[0]] = true;

    }

    if ( 'edit_post' == $args[0] ) {

        if ( $user_caps['edit_others_posts'] )
            return $user_caps;

        if ( !isset( $user_caps['edit_others_listings'] ) or !$user_caps['edit_others_listings'] )
            return $user_caps;

        $user_caps[$req_cap[0]] = true;

    }

    return $user_caps;

}

Ceci est basé principalement sur cet article du Codex .

Je suis toujours en train de me faire mal aux filtres de capacités et il est 2h04, donc mon code pourrait bien être amélioré ...

6
Simon Blackbourn