En WordPress no hay forma de asignar la capacidad para editar (o cualquier acción) una publicación específica a un rol.
Sin embargo, puede filtrar las comprobaciones de capacidades y cambiarlas sobre la marcha utilizando map_meta_cap
.
Al manejar los permisos de publicación, WordPress finalmente se ocupa de solo 4 capacidades:
-
edit_post
-
read_post
-
delete_post
-
publish_post
Luego, cada vez que se realiza una acción en una publicación, asigna estas capacidades a las capacidades "primitivas". Estas son las capacidades con las que estará más familiarizado:
-
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
También hay create_posts
, pero por lo que puedo decir, esto solo se usa en algunos puntos finales REST y para controlar si aparece alguna IU. Al guardar una publicación, create_posts
se asigna a edit_posts
.
Lo que hace map_meta_cap()
es que cuando alguien intenta editar una publicación, determina qué capacidad primitiva se requiere.
Entonces, si un usuario intenta editar una publicación, map_meta_cap()
verifica si es el autor de esa publicación. Si lo son, entonces la meta meta edit_post
se asignará a edit_posts
. Si no son el autor, se asignará a edit_others_posts
. WordPress comprobará si el usuario tiene la capacidad asignada y responderá en consecuencia.
Entonces, si desea cambiar los permisos por página, necesita filtrar map_meta_cap
para cambiar la forma en que asigna las capacidades meta.
En su ejemplo, desea permitir a los usuarios edit_page
para la página de Recursos internos (y otros), pero no editar ninguna otra página. Esto es un poco complicado porque para hacer esto necesitan acceso al menú Páginas en el Tablero. Por lo tanto, deberá otorgar a su rol student
las capacidades edit_pages
y publish_pages
, y luego usar el filtro para revocar esas capacidades página por página:
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 );
Esto evitará la publicación o edición de páginas que no están en $student_pages
.
No he podido encontrar una buena manera de permitir que los usuarios publiquen páginas, pero solo si son un elemento secundario de una página en particular. Cada combinación de capacidades de edición y publicación que he probado ha dado como resultado un comportamiento extraño. No creo que las páginas secundarias sean una buena forma de administrar permisos porque son una cosa que se puede cambiar en el editor de páginas. Esto significa que cambiaría los permisos entre la publicación de una publicación y el redireccionamiento para editarla.
Es mejor que utilice la técnica que describí para permitir la edición de la página de Recursos internos, pero luego divida las subpáginas en un tipo de publicación independiente con sus propios permisos.