Permitir el acceso de roles personalizados al tipo de publicación personalizada en el back-end

8

Así que tengo algunos problemas con esto y no puedo ver por qué. Solo necesito un rol personalizado que pueda acceder al blog en el back-end.

Agregué un nuevo tipo de publicación con un tipo de capacidad blogy un nuevo rol de usuario con todos los límites para permitir a los usuarios con acceso de administrador agregar / editar el tipo de publicación personalizada. Esto funciona para los administradores y pueden acceder al tipo de publicación en el back-end. Sin embargo, los usuarios de mi rol personalizado no pueden acceder al back-end.

Publicar args de nota

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

Registrar rol

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 );

Agregar tapas

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 );

He estado buscando en Google frenéticamente tratando de encontrar la causa de esto. He intentado con mayúsculas en plural, no plural, he intentado agregar capacidades en los argumentos de tipo post. Sin embargo, nunca puedo entrar en el back-end. No tengo ningún otro código en el tema que pueda expulsar a los usuarios del administrador (eliminé mi propio código que los expulsó al probar esto)

Editar Aquí puede ver un volcado de las capacidades blog_manager de la base de datos, hay un poco de pruebas de BS que quedan allí, pero eso no debería impedir que puedan iniciar sesión de lo que sé.

'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
fuente
1
Tenga en cuenta que los roles y las capacidades se guardan de forma persistente . Si tenía alguna versión anterior de esto que no permitía el acceso, todavía podría estar allí como parte del rol. Volcar los datos persistentes y ver si hay algo establecido que no debería estar.
Rarst
Agregué un volcado de las capacidades de la base de datos. Solo tengo las 3 capacidades de publicación establecidas en falso que tengo en el código anterior.
Chris Morris
Instalaría el plugin User Role Editor: wordpress.org/plugins/user-role-editor . Luego, inspeccione manualmente las diferencias entre los usuarios / roles; puede haber algo conflictivo o faltante.
Welcher
Hola @ChrisMorris, ¿cómo te fue con esto? ¿Terminaste encontrando una solución?
Tim Malone

Respuestas:

3

Es difícil solucionar el código anterior porque es solo una parte del código real, pero aquí está el complemento mínimo necesario para registrar un tipo de publicación personalizado (llamado Ejemplo) y un rol personalizado (Blog Manager) que tiene acceso al tipo de publicación personalizada de Ejemplo .

Esto también se puede usar como parte del archivo functions.php de un tema. Simplemente use los ganchos de activación y desactivación del tema en su lugar.

<?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
fuente