Eliminar menú de Custom Post Type para usuarios no administradores
He estado investigando esto todo el día y no he encontrado muchos resultados.
Quiero restringir quién puede ver mis Custom Post Types por nivel de usuario (o de alguna otra manera). Entonces, si la persona que inició sesión no es un 'administrador', los Custom Post Types agregados no son visibles para ellos.
Aquí hay parte de un Custom Post Type que tengo:
add_action('init', 'portfolio_register');
function portfolio_register() {
$labels = array(
'name' => _x('Estudios de Caso', 'nombre general del tipo de post'),
'singular_name' => _x('Ítem de Estudio de Caso', 'nombre singular del tipo de post'),
'add_new' => _x('Agregar Nuevo', 'ítem de portafolio'),
'add_new_item' => __('Agregar Nuevo Ítem de Estudio de Caso'),
'edit_item' => __('Editar Ítem de Estudio de Caso'),
'new_item' => __('Nuevo Ítem de Estudio de Caso'),
'view_item' => __('Ver Ítem de Estudio de Caso'),
'search_items' => __('Buscar Estudios de Caso'),
'not_found' => __('Nada encontrado'),
'not_found_in_trash' => __('Nada encontrado en la Papelera'),
'parent_item_colon' => ''
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
/*'menu_icon' => get_stylesheet_directory_uri() . '/article16.png',*/
'rewrite' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','thumbnail')
);
register_post_type( 'portfolio' , $args );
}
Y aquí están las posibles soluciones que encontré que no funcionan para eliminar el menú de Custom Post Type:
function remove_menus()
{
global $menu;
global $current_user;
get_currentuserinfo();
if($current_user->user_login != 'admin')
{
$restricted = array(__('Entradas'),
__('Medios'),
__('Enlaces'),
__('Páginas'),
__('Comentarios'),
__('Apariencia'),
__('Plugins'),
__('Usuarios'),
__('Herramientas'),
__('Ajustes')
);
end ($menu);
while (prev($menu)){
$value = explode(' ',$menu[key($menu)][0]);
if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
}// fin while
}// fin if
}
add_action('admin_menu', 'remove_menus');
Lo anterior funciona para eliminar los elementos del menú predeterminados, pero no pude hacer que eliminara un menú de Custom Post Type. Además, es específico del nombre de usuario, lo cual está bien si pudiera agregar más de un usuario.
global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) {
.......
}
Lo anterior no funcionó en absoluto.
Gracias.
Codex - Registrar Tipo de Entrada
Consulta los argumentos capability_type
y capabilities
para register_post_type
.
Puedes pasar al argumento capabilities
un array de capacidades para mapearlas a los permisos necesarios, aquí tienes un ejemplo del array de argumentos con capacidades personalizadas.
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'rewrite' => true,
'capabilities' => array(
'publish_posts' => 'AÑADIR_CAP_AQUÍ',
'edit_posts' => 'AÑADIR_CAP_AQUÍ',
'edit_others_posts' => 'AÑADIR_CAP_AQUÍ',
'delete_posts' => 'AÑADIR_CAP_AQUÍ',
'delete_others_posts' => 'AÑADIR_CAP_AQUÍ',
'read_private_posts' => 'AÑADIR_CAP_AQUÍ',
'edit_post' => 'AÑADIR_CAP_AQUÍ',
'delete_post' => 'AÑADIR_CAP_AQUÍ',
'read_post' => 'AÑADIR_CAP_AQUÍ',
),
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','thumbnail')
);
Por supuesto, reemplazarías AÑADIR_CAP_AQUÍ
con una capacidad. Si quisieras limitar este tipo de entrada solo a administradores, simplemente usa una capacidad que solo los administradores tengan, como manage_options
.
Tabla de roles y sus capacidades (para referencia rápida).
http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

¿Podrías explicarme ADD_CAP_HERE
? Necesito ocultar el menú de mi tipo de contenido personalizado para los editores; Tu código no ayudó a ocultar el elemento del menú :(

@numediaweb -- Desde http://codex.wordpress.org/Roles_and_Capabilities, verás una lista de capacidades para 'Editor' y superiores como 'edit_dashboard' (que te funcionará bien)

Bien, después de hacer más búsquedas en Google finalmente encontré una respuesta y la combiné con uno de los scripts anteriores para crear lo que estaba buscando. A continuación está lo que hice por si alguien más está buscando hacer lo mismo:
global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) {
.....
}
El código anterior obtendrá el nivel del usuario actual y si tiene permisos para actualizar/editar plugins, entonces tendrá acceso a las funciones contenidas.
add_filter( 'custom_menu_order', 'toggle_custom_menu_order' );
function remove_those_menu_items( $menu_order ){
global $menu;
foreach ( $menu as $mkey => $m ) {
$key = array_search( 'edit.php?post_type=portfolio', $m );
$keyB = array_search( 'edit.php?post_type=bio', $m );
$keyC = array_search( 'edit.php?post_type=philo', $m );
if ( $key || $keyB || $keyC )
unset( $menu[$mkey] );
}
return $menu_order;
}
add_filter( 'menu_order', 'remove_those_menu_items' );
Lo anterior es lo que realmente te permite eliminar los tipos de contenido personalizados del menú de administración. Solo necesitas agregar tantas variables $key
como necesites. En lugar de entrar en detalles sobre lo que significa lo anterior, puedes leerlo en el original aquí.

No sé qué está mal con el código, pero cada vez que necesito limitar elementos del menú a los usuarios, uso: Editor de Menú de Administración, un plugin que hace exactamente eso por ti.

Gracias por la respuesta, pero eso no hace realmente lo que necesito hacer. Te permite mover elementos del menú y todo, pero no ocultar elementos del menú para usuarios que no son administradores. Además, preferiría no usar un plugin para esto. Gracias.
