Permitir acceso a un rol personalizado para un tipo de entrada personalizado en el backend

5 may 2015, 14:01:43
Vistas: 18.3K
Votos: 10

Estoy teniendo algunos problemas con esto y no logro ver por qué. Solo necesito que un rol personalizado pueda acceder al blog en el backend.

He añadido un nuevo tipo de entrada con un Capability type de blog y un nuevo rol de usuario con todas las capacidades necesarias para que los usuarios administradores puedan añadir/editar el custom post type. Esto funciona para los administradores y pueden acceder al tipo de entrada en el backend. Sin embargo, los usuarios con mi rol personalizado no pueden entrar al backend en absoluto.

Argumentos importantes del post type

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

Registrar rol

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

Añadir capacidades

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 frenéticamente en Google tratando de encontrar la causa de esto. He probado con capacidades en plural y singular, he intentado añadir capacidades en los argumentos del post type. Sin embargo, nunca logro acceder al backend. No tengo ningún otro código en el tema que pueda expulsar a los usuarios del admin (he eliminado mi propio código que los expulsaba mientras probaba esto).

Edición Aquí puedes ver un volcado de las capacidades del blog_manager desde la base de datos, hay bastante basura de pruebas ahí, pero eso no debería impedirles iniciar sesión según lo que sé.

'blog_manager' => array (
    'name' => 'Gestor de Blog',
    '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,
    ),
)
4
Comentarios

Ten en cuenta que los roles y capacidades se guardan de forma persistente. Si tenías alguna versión anterior de esto que no permitía el acceso, todavía podría estar ahí como parte del rol. Vuelca los datos persistentes y comprueba si hay algo configurado que no debería estarlo.

Rarst Rarst
5 may 2015 17:32:31

He añadido 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 Chris Morris
5 may 2015 17:54:49

Instalaría el plugin User Role Editor - https://wordpress.org/plugins/user-role-editor/. Luego inspeccionaría manualmente las diferencias entre los usuarios/roles - podría haber algo conflictivo o faltante.

Welcher Welcher
21 may 2015 02:50:29

Hola @ChrisMorris, ¿cómo te fue con esto? ¿Lograste encontrar una solución?

Tim Malone Tim Malone
29 jun 2016 11:18:05
Todas las respuestas a la pregunta 2
1

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

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

<?php
/**
 * Plugin Name: WPSE 186337
 * Description: Depurar la pregunta 186337 de WordPress StackExchange
 * Plugin URI: https://wordpress.stackexchange.com/questions/186337/
 * Author: Nathan Johnson
 * Licence: GPL2+
 * Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
 */

//* No accedas a este archivo directamente
defined( 'ABSPATH' ) or die();

//* Añade acción a init para registrar el tipo de publicación personalizado
add_action( 'init', 'se186337_init' );

//* Registra el hook de activación para añadir el rol Blog Manager
register_activation_hook( __FILE__ , 'se186337_activation' );

//* Registra el hook de desactivación para eliminar el rol Blog Manager
register_deactivation_hook( __FILE__ , 'se186337_deactivation' );

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

    //* Capacidades primitivas usadas fuera de map_meta_cap()
    'edit_blogs'             => true,
    'edit_others_blogs'      => true,
    'publish_blogs'          => true,
    'read_private_blogs'     => true,

    //* Capacidades primitivas usadas dentro de 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 );
}
21 feb 2017 20:22:16
Comentarios

en la función se186337_activation() has asignado las capacidades, sin embargo ¿por qué no has usado la función $add->cap para usarla dentro de otra función con un bucle foreach para añadir capacidades de esa manera? espero que tenga sentido...

Krys Krys
22 mar 2022 08:08:09
0

Si estás de acuerdo con usar un plugin, puedes utilizar el siguiente:

https://wordpress.org/plugins/capability-manager-enhanced/

7 ago 2016 01:02:05