Función de usuario personalizada que solo puede editar una página específica (no personalizada) y todas las páginas secundarias [duplicadas]

4

Mi sitio tiene varias páginas estáticas y varios tipos de publicaciones personalizadas. Estoy tratando de crear una función de usuario personalizada llamada students y dar a los estudiantes acceso SOLO a ciertos tipos de publicaciones personalizadas y ciertas páginas estáticas específicas.

Comprendo cómo hacer esto con los tipos de publicaciones personalizadas utilizando add_cap() y rellenando los campos 'capacity_type' y 'map_meta_cap' pasados a register_post_type para ese tipo de publicación personalizada.

Sin embargo, no entiendo cómo hacer esto para las páginas genéricas (que no son personalizadas, pero se han rellenado con contenido diferente) . Específicamente, me gustaría tomar una página principal llamada internal-resources y dar a los usuarios la capacidad de edición student para esa página específica. Hay algunas páginas secundarias de la página internal-resources que también deberían poder editar. Finalmente, me gustaría que pudieran crear nuevas páginas secundarias bajo internal-resources . Sin embargo, otras páginas estáticas como Research y People NO deberían poder editarse. Esto no debería ser demasiado difícil, ¿verdad?

¡Gracias por la ayuda!

    
pregunta nViz 06.02.2018 - 08:56

1 respuesta

3

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.

    
respondido por el Jacob Peattie 06.02.2018 - 12:03

Lea otras preguntas en las etiquetas