Capacidades y tipos de publicaciones personalizadas

26

Tengo un tipo de publicación personalizado que me gustaría restringir el acceso a ciertos roles, sin embargo, ya he agregado contenido utilizando el tipo de publicación personalizada y ahora tengo que restringirlos. La capacidad_tipo fue 'post'

'capability_type' => 'post'

¿Qué está bien ya que el contenido se muestra en el backend? Sin embargo, ahora, tan pronto como agregué alguna capacidad, el contenido desaparecerá del backend.

He intentado personalizar el tipo de capacidad para incluir definiciones en plural para construir el mío, pero tan pronto como elimine o cambie los tipos de capacidad, ¡se habrá ido!

código completo:

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),

    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,

    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    )
);

register_post_type( 'gallery', $args );
}

También he probado esto con un tipo de publicación personalizado completamente nuevo y, independientemente del tipo de capacidad, obtengo el mismo problema, por ejemplo, incluso si lo quito y agrego mi personalizado:

'capability_type' => array('movie','movies');
    
pregunta erichmond 30.07.2013 - 16:20

3 respuestas

32

Después de una conversación rápida con Magicroundabout que señaló un recurso útil de Justin Tadlock , resulta que las capacidades para la costumbre los tipos de publicación no existen realmente a menos que use add_cap para el rol, por ejemplo, para el siguiente tipo de publicación personalizada:

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    ),
    // as pointed out by iEmanuele, adding map_meta_cap will map the meta correctly 
    'map_meta_cap' => true
);

register_post_type( 'gallery', $args );
}

las capacidades adicionales deben agregarse a un rol para que los permisos realmente funcionen en el backend, incluido el 'administrador', por ejemplo:

function add_theme_caps() {
    // gets the administrator role
    $admins = get_role( 'administrator' );

    $admins->add_cap( 'edit_gallery' ); 
    $admins->add_cap( 'edit_galleries' ); 
    $admins->add_cap( 'edit_other_galleries' ); 
    $admins->add_cap( 'publish_galleries' ); 
    $admins->add_cap( 'read_gallery' ); 
    $admins->add_cap( 'read_private_galleries' ); 
    $admins->add_cap( 'delete_gallery' ); 
}
add_action( 'admin_init', 'add_theme_caps');

Espero que esto sea útil para otros.

    
respondido por el erichmond 30.07.2013 - 22:24
7

Añadir:

map_meta_cap => true

a su matriz $ args. Mire aquí , para obtener más información. Espero que ayude!

    
respondido por el iEmanuele 30.07.2013 - 19:39
1

En mi humilde opinión nunca mapeas tus propias capacidades. Asegúrate de usar el complemento meta cap de map para hacerlo. enlace

Pasé días tratando de asignar mis gorras personalizadas manualmente con código. Simplemente instale ese complemento, asigne sus mayúsculas y desactive una vez que esté trabajando. Si va a crear roles personalizados, necesitará el complemento Miembros .

La forma en que hago la prueba para HACER QUE mi rol tenga esas capacidades (a veces juras que sí, pero en realidad no) crea una página de depuración con:

    if( !function_exists( 'current_user_has_role' ) ){
        function current_user_has_role( $role ){
            $current_user = new WP_User( wp_get_current_user()->ID );
            $user_roles = $current_user->roles;
            $is_or_not = in_array( $role, $user_roles );
            return $is_or_not;
        }
    }

Esto te mostrará qué capacidades tienes de hecho.

    
respondido por el TR3B 30.07.2013 - 23:56

Lea otras preguntas en las etiquetas