Permitindo acesso de função personalizada ao tipo de postagem personalizado no backend

8

Então, eu estou tendo alguns problemas com isso e não consigo entender o porquê. Eu só preciso de uma função personalizada que possa acessar o blog no back-end.

blogAdicionei um novo tipo de postagem com um tipo de capacidade e uma nova função de usuário com todas as letras maiúsculas, permitindo que os usuários de acesso administrativo adicionem / editem o tipo de postagem personalizado. Isso funciona para administradores e eles podem acessar o tipo de postagem no back-end. No entanto, os usuários da minha função personalizada não conseguem acessar o back-end.

Args do tipo de postagem da nota

"capability_type" => 'blog',
"map_meta_cap" => true,

Registrar função

function add_blog_manager_role(){
    add_role(
        'blog_manager',
        'Blog Manager',
        array(
            'read' => true,
            'edit_posts' => false,
            'delete_posts' => false,
            'publish_posts' => false,
            'upload_files' => true
        )
    );
}
add_action( 'admin_init', 'add_blog_manager_role', 4 );

Adicionar Caps

function add_blog_role_caps() {
    $roles = array('blog_manager', 'editor','administrator');
    foreach($roles as $the_role) {
        $role = get_role($the_role);
        $role->add_cap( 'read' );
        $role->add_cap( 'read_blog');
        $role->add_cap( 'read_private_blog' );
        $role->add_cap( 'edit_blog' );
        $role->add_cap( 'edit_others_blog' );
        $role->add_cap( 'edit_published_blog' );
        $role->add_cap( 'publish_blog' );
        $role->add_cap( 'delete_others_blog' );
        $role->add_cap( 'delete_private_blog' );
        $role->add_cap( 'delete_published_blog' );
    }
}
add_action('admin_init', 'add_blog_role_caps', 5 );

Eu tenho pesquisado freneticamente tentando encontrar a causa disso. Eu tentei com maiúsculas plurais, não plurais, tentei adicionar recursos ao args do tipo post. No entanto, nunca sou capaz de entrar no back-end. Não tenho nenhum outro código no tema que possa expulsar os usuários do administrador (removi meu próprio código que os expulsou durante o teste)

Editar Aqui você pode ver um despejo dos recursos blog_manager do banco de dados, ainda resta bastante BS de teste lá dentro, mas isso não deve impedir que eles consigam acessar o que eu sei.

'blog_manager' => array (
    'name' => 'Blog Manager',
    'capabilities' => array (
        'read' => true,
        'edit_posts' => false,
        'delete_posts' => false,
        'publish_posts' => false,
        'upload_files' => true,
        'read_blog' => true,
        'read_private_blog' => true,
        'edit_blog' => true,
        'edit_others_blog' => true,
        'edit_published_blog' => true,
        'publish_blog' => true,
        'delete_others_blog' => true,
        'delete_private_blog' => true,
        'delete_published_blog' => true,
        'blog' => true,
        'read_private_blogs' => true,
        'edit_blogs' => true,
        'edit_others_blogs' => true,
        'edit_published_blogs' => true,
        'publish_blogs' => true,
        'delete_others_blogs' => true,
        'delete_private_blogs' => true,
        'delete_published_blogs' => true,
        'delete_blogs' => true,
        'delete_blog' => true,
    ),
)
Chris Morris
fonte
1
Observe que funções e recursos são salvos persistentemente . Se você tinha alguma versão anterior que não permitia acesso, ela ainda pode estar lá como parte da função. Despejar os dados persistentes e ver se há algo definido que não deveria ser.
Rarst
Eu adicionei um despejo dos recursos do banco de dados. Eu só tenho os 3 recursos de postagem definidos como false que eu tenho no código acima.
Chris Morris
Eu instalaria o plugin User Role Editor - wordpress.org/plugins/user-role-editor . Em seguida, inspecione manualmente as diferenças entre os usuários / funções - pode haver algo conflitante ou ausente.
Welcher
Oi @ChrisMorris, como você foi com isso? Você acabou encontrando uma solução?
Tim Malone

Respostas:

3

É difícil solucionar problemas do código acima, porque é apenas uma parte do código real, mas aqui está o plug-in mínimo necessário para registrar um tipo de postagem personalizado (chamado Exemplo) e uma função personalizada (Gerenciador de Blog) que tem acesso ao tipo de postagem personalizada de Exemplo .

Isso pode ser usado como parte do arquivo functions.php de um tema também. Basta usar os ganchos de ativação e desativação de tema.

<?php
/**
 * Plugin Name: WPSE 186337
 * Description: Debug WordPress StackExchange question 186337
 * Plugin URI: /wordpress/186337/
 * Author: Nathan Johnson
 * Licence: GPL2+
 * Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
 */

//* Don't access this file directly
defined( 'ABSPATH' ) or die();

//* Add action to init to register custom post type
add_action( 'init', 'se186337_init' );

//* Register activation hook to add Blog Manager role
register_activation_hook( __FILE__ , 'se186337_activation' );

//* Register deactivation hook to remove Blog Manager role
register_deactivation_hook( __FILE__ , 'se186337_deactivation' );

function se186337_activation() {
  $caps = [
    //* Meta capabilities
    'read'                   => true,
    'edit_blog'              => true,
    'read_blog'              => true,
    'delete_blog'            => true,

    //* Primitive capabilities used outside of map_meta_cap()
    'edit_blogs'             => true,
    'edit_others_blogs'      => true,
    'publish_blogs'          => true,
    'read_private_blogs'     => true,

    //* Primitive capabilities used within of map_meta_cap()
    'delete_blogs'           => true,
    'delete_private_blogs'   => true,
    'delete_published_blogs' => true,
    'delete_others_blogs'    => true,
    'edit_private_blogs'     => true,
    'edit_published_blogs'   => true,
  ];

  add_role( 'blog_manager', 'Blog Manager', $caps );
}

function se186337_deactivation() {
  remove_role( 'blog_manager' );
}

function se186337_init() {
  $labels = [
    'name'          => __( 'Examples' ),
    'singular_name' => __( 'Example' ),
  ];
  $args = [
    'labels'          => $labels,
    'public'          => true,
    'has_archive'     => true,
    'capability_type' => 'blog',
    'map_meta_cap'    => true,
  ];
  register_post_type( 'examples', $args );
}
Nathan Johnson
fonte