web-dev-qa-db-fra.com

Rôle d'utilisateur personnalisé pouvant uniquement modifier une page spécifique (de type non personnalisé) et toutes les pages enfants

Mon site comporte plusieurs pages statiques et plusieurs types de publication personnalisés. J'essaie de créer un rôle d'utilisateur personnalisé appelé students et de permettre aux étudiants d'accéder UNIQUEMENT à certains types de publication personnalisés et à certaines pages statiques spécifiques.

Je comprends comment faire cela avec les types de publication personnalisés en utilisant add_cap() et en renseignant les champs 'capabilité' et 'map_meta_cap' passés à register_post_type pour ce type de publication personnalisé.

Cependant, je ne comprends pas comment procéder pour les pages génériques (qui ne sont pas personnalisées, mais qui ont été remplies avec un contenu différent) . Plus précisément, j'aimerais prendre une page parent appelée internal-resources et donner aux utilisateurs student la possibilité d’éditer cette page spécifique. Certaines pages enfants de la page internal-resources devraient également pouvoir être modifiées. Enfin, je voudrais qu’ils puissent créer de nouvelles pages enfants sous internal-resources. Cependant, d’autres pages statiques telles que Research et People qu’elles ne devraient PAS pouvoir éditer. Cela ne devrait pas être trop difficile, non?

Merci pour l'aide!!

4
nViz

WordPress ne permet en aucun cas d'attribuer la possibilité de modifier (ou toute action) une publication spécifique à un rôle.

Toutefois, vous pouvez filtrer les vérifications des capacités et les modifier à la volée à l’aide de map_meta_cap .

Lors de la gestion des autorisations de publication, WordPress ne traite finalement que dans 4 capacités:

  • edit_post
  • read_post
  • delete_post
  • publish_post

Ensuite, chaque fois qu'une action est effectuée sur un message, il mappe ces fonctionnalités sur les fonctionnalités "primitives". Voici les fonctionnalités avec lesquelles vous serez plus familier:

  • publish_posts
  • edit_posts
  • edit_others_posts
  • edit_private_posts
  • edit_published_posts
  • read
  • read_private_posts
  • delete_posts
  • delete_private_posts
  • delete_published_posts
  • delete_others_posts

Il existe également create_posts, mais pour autant que je sache, il n’est utilisé que dans certains noeuds finaux REST et pour contrôler la présence ou non d’une interface utilisateur. Lorsque vous enregistrez un article, create_posts est associé à edit_posts.

Ce que map_meta_cap() fait, c'est que lorsque quelqu'un tente de modifier une publication, il détermine quelle capacité primitive est requise.

Ainsi, si un utilisateur tente de modifier un message, map_meta_cap() vérifie s’il en est l’auteur. S'ils le sont, la capacité méta edit_post sera mappée sur edit_posts. S'ils ne sont pas l'auteur, il sera mappé sur edit_others_posts. WordPress vérifiera ensuite si l'utilisateur dispose de la fonctionnalité mappée et répondra en conséquence.

Par conséquent, si vous souhaitez modifier les autorisations page par page, vous devez filtrer map_meta_cap pour modifier la façon dont il attribue les méta-fonctionnalités.

Dans votre exemple, vous souhaitez laisser les utilisateurs edit_page pour la page des ressources internes (et autres), sans modifier aucune autre page. C'est un peu délicat, car pour ce faire, ils doivent accéder au menu Pages du tableau de bord. Vous devrez donc accorder à votre rôle student les fonctionnalités edit_pages et publish_pages, puis utiliser le filtre pour révoquer ces fonctionnalités page par page:

function wpse_293259_map_meta_cap( $required_caps, $cap, $user_id, $args ) {
    if ( in_array( $cap, ['edit_post', 'publish_post'] ) ) {
        $page_id = $args[0]; // The ID of the post being edited.
        $student_pages = [1,2,3]; // The IDs of the pages students are allowed to edit.

        /**
         * If the page being edited is not one students can edit, check if the user
         * is a student. If they are, set the required capabilities to 'do_not_allow'
         * to prevent them editing.
         */
        if ( ! in_array( $page_id, $student_pages ) ) {
            $user = new WP_User( $user_id );

            if ( in_array( 'students', $user->roles ) ) {
                $required_caps = ['do_not_allow'];
            }
        }
    }

    return $required_caps;
}
add_filter( 'map_meta_cap', 'wpse_293259_map_meta_cap', 10, 4 );

Cela empêchera la publication ou la modification de pages qui ne sont pas dans le $student_pages.

Je n'ai pas été en mesure de trouver un bon moyen d'autoriser les utilisateurs à publier des pages, mais uniquement s'ils sont les enfants d'une page particulière. Chaque combinaison de capacités d'édition et de publication que j'ai essayée a entraîné un comportement étrange. Je ne pense pas que les pages enfant soient un bon moyen de gérer les autorisations, car elles peuvent être modifiées dans l'éditeur de page. Cela signifie que vous modifieriez les autorisations entre la publication d'un message et sa redirection pour le modifier.

Vous feriez peut-être mieux d'utiliser la technique que j'ai décrite pour autoriser la modification de la page Ressources internes, puis divisez les sous-pages en un type de publication séparé avec ses propres autorisations.

2
Jacob Peattie