Capacidades y tipos de publicaciones personalizadas

30

Tengo un tipo de publicación personalizado al que me gustaría restringir el acceso a ciertos roles, sin embargo, ya he agregado contenido usando el tipo de publicación personalizada y ahora tengo que restringirlos. El tipo_capacidad era 'post'

'capability_type' => 'post'

Sin embargo, ¿qué está bien cuando el contenido se muestra en el backend? Ahora, tan pronto como agrego alguna capacidad, el contenido desaparece del backend.

¡Intenté personalizar el tipo de capacidad para incluir definiciones en plural para construir la mía propia, pero tan pronto como elimino o cambio los tipos de capacidad, desapareció!

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 probé 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 elimino y agrego mi personalizado:

'capability_type' => array('movie','movies');
erichmond
fuente

Respuestas:

40

Después de una conversación rápida con Magicroundabout que señaló un recurso útil de Justin Tadlock , resulta que las capacidades para los tipos de publicaciones personalizadas en realidad no existen 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.

erichmond
fuente
11
add_theme_caps()debe llamarse solo una vez, no cada vez que se carga una página de administrador. Sería mejor usarlo switch_themecomo gancho para la activación del tema o register_activation_hooken la activación del complemento.
d79
¡Agradable! Me gusta usar wp cli para agregar las capacidades si es un sitio completamente personalizado / único, ya que es una acción que solo tiene que suceder una vez.
squarecandy
8

Añadir:

map_meta_cap => true

a su matriz $ args. Mira aquí , para más. ¡Espero eso ayude!

iEmanuele
fuente
1
Esto es lo que pensé también, pero no totalmente el caso.
erichmond
Esto funcionó para mí
Shikyo
1

En mi humilde opinión, nunca mapeas tus propias capacidades. Asegúrate de usar el complemento meta cap del mapa para hacerlo. http://codex.wordpress.org/Function_Reference/map_meta_cap

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

La forma en que pruebo para ASEGURARME de que mi rol tiene esas capacidades (a veces juras que lo haces pero en realidad no lo haces) hace 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 le mostrará qué capacidades tiene de hecho.

Ben Racicot
fuente
-1

Para los tipos de publicaciones personalizadas, NO sugiero usar hook:

add_action( 'registered_post_type', 'your_func', 10, 2 );

en cambio sugiero usar:

add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name ) 
{
   if ( $name == "your_custom_post_name" ) 
   ...
}
T.Todua
fuente
la sugerencia es buena, pero no responde la pregunta.
Aurovrata