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!!
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.