Função de usuário personalizada que só pode editar uma página específica (não de tipo personalizado) e todas as páginas filhas [duplicadas]

4

Meu site tem várias páginas estáticas e vários tipos de postagem personalizados. Estou tentando criar uma função de usuário personalizada chamada students e dar aos alunos acesso a SOMENTE determinados tipos de postagens personalizadas e determinadas páginas estáticas específicas.

Entendo como fazer isso com tipos de postagem personalizados usando add_cap() e preenchendo os campos 'capability_type' e 'map_meta_cap' transmitidos para register_post_type para esse tipo de postagem personalizado.

No entanto, não entendo como fazer isso para páginas genéricas (que não são personalizadas, mas foram preenchidas com conteúdo diferente) . Especificamente, gostaria de ter uma página pai chamada internal-resources e fornecer o recurso de edição de student users para essa página específica. Existem algumas páginas filhas da página internal-resources que devem poder editar também. Por fim, gostaria que pudessem criar novas páginas filhas em internal-resources . No entanto, outras páginas estáticas, como Research e People , NÃO devem poder editar. Isso não deve ser muito difícil, né?

Obrigado pela ajuda !!

    
por nViz 06.02.2018 / 08:56

1 resposta

3

Não há como o WordPress atribuir a capacidade de editar (ou qualquer ação) uma postagem específica a uma função.

No entanto, você pode filtrar verificações de recursos e alterá-las rapidamente usando o map_meta_cap .

Ao lidar com as permissões pós-venda, o WordPress acaba negociando apenas 4 recursos:

  • edit_post
  • read_post
  • delete_post
  • publish_post

Então, sempre que uma ação é executada em uma postagem, ela mapeia esses recursos para os recursos 'primitivos'. Estas são as capacidades com as quais você está mais 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

Há também create_posts , mas, até onde sei, isso é usado apenas em alguns pontos de extremidade REST e para controlar se alguma UI aparece. Ao salvar uma postagem, create_posts é mapeado para edit_posts .

O que o map_meta_cap() faz é que, quando alguém tenta editar um post, ele determina qual recurso primitivo é necessário.

Portanto, se um usuário tentar editar uma postagem, map_meta_cap() verificará se ele é o autor dessa postagem. Se eles estiverem, a capacidade edit_post meta será mapeada para edit_posts . Se eles não forem o autor, serão mapeados para edit_others_posts . O WordPress irá então verificar se o usuário tem a capacidade mapeada e responder de acordo.

Portanto, se você quiser alterar as permissões por página, precisará filtrar map_meta_cap para alterar a maneira como atribui as meta-capacidades.

Em seu exemplo, você deseja permitir que os usuários edit_page da página Recursos internos (e outros), mas não editem outras páginas. Isso é um pouco complicado, porque para isso eles precisam acessar o menu Páginas no Painel. Portanto, você precisa conceder à função student os recursos edit_pages e publish_pages e, em seguida, usar o filtro para revogar esses recursos 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 );

Isso impedirá a publicação ou edição de páginas que não estejam no $student_pages .

Não consegui descobrir uma boa maneira de permitir que os usuários publiquem páginas, mas apenas se forem filhos de uma determinada página. Cada mistura de recursos de edição e publicação que eu tentei resultou em comportamento estranho. Eu não acho que as páginas filho são uma boa maneira de gerenciar permissões, porque elas são uma coisa que pode ser alterada no editor de páginas. Isso significa que você estaria alterando as permissões entre publicar uma postagem e ser redirecionado novamente para editá-la.

Pode ser melhor usar a técnica que descrevi para permitir a edição da página Recursos internos, mas depois dividir as subpáginas em um tipo de postagem separado com suas próprias permissões.

    
por Jacob Peattie 06.02.2018 / 12:03