web-dev-qa-db-fra.com

Autorisations de rôle d'utilisateur basées sur les taxonomies

Je me demandais s'il était possible de configurer des rôles d'utilisateur de manière à ce que les utilisateurs de certains groupes puissent UNIQUEMENT éditer des publications auxquelles une taxonomie spécifique est attribuée, par exemple:

Properties (Post Type)
    Taxonomy One
    Taxonomy Two
    Taxonomy Three

User Roles
    Group One - Can only edit properties with 'Taxonomy One' assigned.
    Group Two - Can only edit properties with 'Taxonomy Two' assigned.
    Group Three - Can only edit properties with 'Taxonomy Three' assigned.

J'utilise actuellement le plugin Membres pour la gestion des rôles, et j'utilise des types de publication/taxonomies personnalisés.

D'après ce que j'ai vu jusqu'à présent, il ne semble pas que vous puissiez limiter l'accès aux POSTS en fonction de TAXONOMIES.

UPDATE

J'ai maintenant des autorisations qui fonctionnent pour les types de publication en utilisant le code suivant:

register_post_type( 'properties',
    array(
        'labels' => array(
            'name' => __( 'Properties' ),
            'singular_name' => __( 'Property' )
        ),
        'public' => true,
        'capability_type' => 'property',
        'map_meta_cap' => true,
        'capabilities' => array(
            'publish_posts' => 'publish_properties', // This allows a user to publish a property.
            'edit_posts' => 'edit_properties', // Allows editing of the user’s own properties but does not grant publishing permission.
            'edit_others_posts' => 'edit_others_properties', // Allows the user to edit everyone else’s properties but not publish.
            'delete_posts' => 'delete_properties', // Grants the ability to delete properties written by that user but not others’ properties.
            'delete_others_posts' => 'delete_others_properties', // Capability to edit properties written by other users.
            'read_private_posts' => 'read_private_properties', // Allows users to read private properties.
            'edit_post' => 'edit_property', // Meta capability assigned by WordPress. Do not give to any role.
            'delete_post' => 'delete_property', // Meta capability assigned by WordPress. Do not give to any role.
            'read_post' => 'read_property', // Meta capability assigned by WordPress. Do not give to any role.
        )
    )
);

Une section "Propriétés" est maintenant apparue lors de la modification des rôles dans le plug-in "Membres", ce qui me permet de restreindre/autoriser l'accès. Juste besoin de savoir si ceci est faisable pour chaque taxonomie maintenant :)

1
Lighty_46

Vous pourrez peut-être utiliser le filtre user_has_cap utilisé lors de la recherche d'une fonctionnalité particulière (trouvée dans /wp-includes/class-wp-user.php dans has_cap):

    /**
     * Dynamically filter a user's capabilities.
     *
     * @since 2.0.0
     * @since 3.7.0 Added the user object.
     *
     * @param array   $allcaps An array of all the user's capabilities.
     * @param array   $caps    Actual capabilities for meta capability.
     * @param array   $args    Optional parameters passed to has_cap(), typically object ID.
     * @param WP_User $user    The user object.
     */
    $capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this );

Donc, ce serait quelque chose comme:

add_filter('user_has_cap','check_post_taxonomy',10,4);
function check_post_taxonomy($allcaps,$caps,$args,$user) {
    global $post; if (!isset($post)) {return $allcaps;}

    $group = get_user_meta($user->ID,'special_edit_group',true);
    $taxonomy = 'taxonomy_'.$group; // maybe set to a, b or c?
    $terms = get_the_terms($post->ID,$taxonomy);

    // if there are no terms, remove the user capability(s) for this check
    // you may have to experiment to remove all the ones you want to
    if (!$terms) {
        unset($allcaps['edit_properties']);
    }

    return $allcaps;
}

Je l’ai fait de cette façon parce que j’ai réalisé que la logique de la question n’était pas tout à fait juste. Si un type de publication a les taxinomies A, B et C attribuées, même si vous définissez ces filtres de capacité pour les groupes de rôles comme vous le dites, les trois groupes de rôles pourront néanmoins modifier n'importe quoi dans ce type de publication. En d'autres termes, il n'y a pas de cas où la taxonomie A, B ou C n'est "pas" attribuée.

Au lieu de cela, je pense que vous voulez vraiment dire "vérifiez si ce post a des termes qui lui sont attribués dans la taxonomie A" ... et si c'est le cas du groupe A pour le modifier, etc. (Remarque: je ne sais pas si le code ci-dessus fonctionnera réellement dans ce cas. Il faudra peut-être plus de travail. Par exemple, il s'agit actuellement de rechercher une clé méta utilisateur pour le groupe plutôt qu'un rôle/groupe réel.)

1
majick

En fait, j'ai déterré ce blog de développeurs de plug-ins et voici ce qu'il propose à titre d'information.

Les méta-fonctionnalités sont des fonctionnalités octroyées à chaque utilisateur. Les trois que nous traitons ici sont:

edit_post delete_post read_post

Pour les articles de blog classiques, WordPress les "mappe" aux fonctionnalités spécifiques accordées aux rôles d'utilisateur. Par exemple, un utilisateur peut se voir attribuer la fonctionnalité edit_post pour post 100 s'il est l'auteur du post ou s'il possède la fonctionnalité edit_others_posts.

Lorsque vous utilisez des types de publication personnalisés, ce mappage ne se produit pas automatiquement si vous configurez des fonctionnalités personnalisées. Nous devons trouver notre propre solution.

Dans ce tutoriel ...

http://justintadlock.com/archives/2010/07/10/meta-capabilities-for-custom-post-types

* Je ne peux pas encore commenter, j'ai donc posté une réponse.

0
Jarmerson