Restringir la vista de tipos de contenido personalizados por rol de usuario
He creado un tipo de contenido personalizado y varios roles de usuario personalizados, y quiero poder restringir la vista del tipo de contenido según roles específicos.
¿Existe alguna manera directa de restringir esto?
Cada rol tiene capacidades.
Aquí hay un simple colaborador para nuestro proyecto: (solo escribe y edita)
add_role('contributor', 'Contributor', array(
'read' => true,
'edit_posts' => true,
'delete_posts' => false,
));
Ahora él tiene una nueva capacidad (puede editar publicaciones de otras personas)
function add_capability()
{
$role = get_role('contributor');
$role->add_cap('edit_others_posts');
}
add_action('admin_init', 'add_capability');
Ahora para agregar sus nuevas capacidades para nuestro nuevo tipo de publicación. Primero creemos el tipo de publicación:
function create_myposttype()
{
register_post_type(
'myposttype',
array(
'public' => true,
'capability_type' => 'myposttype',
'capabilities' => array(
'publish_posts' => 'publish_myposttypes',
'edit_posts' => 'edit_myposttypes',
'edit_others_posts' => 'edit_others_myposttypes',
'read_private_posts' => 'read_private_myposttypes',
'edit_post' => 'edit_myposttype',
'delete_post' => 'delete_myposttype',
'read_post' => 'read_myposttype',
),
)
);
}
add_action('init', 'create_myposttype');
El tipo de publicación está creado pero el colaborador no tiene poder sobre él. Vamos a darle algo de poder:
function add_capability()
{
$role = get_role('contributor');
$role->add_cap('read_myposttype');
$role->add_cap('edit_myposttypes');
$role->add_cap('delete_myposttype', false); // para estar seguros
}
add_action('admin_init', 'add_capability');
La capacidad read_post y read_* asegura que el usuario con ese rol asignado no podrá ver y acceder a esa área actual. Obtendrá ese error genérico de WordPress:
No tienes permisos suficientes para acceder a esta página
Y hagamos que nuestros autores (ese rol predeterminado) no puedan ver las publicaciones de myposttype:
function remove_author_capability()
{
$role = get_role('author');
$role->add_cap('read_myposttype', false);
}
add_action('admin_init', 'remove_author_capability');
Recuerda limpiar:
function add_roles_on_activation() // agregar roles en la activación
{
add_role('contributor', 'Contributor', array(
'read' => true,
'edit_posts' => true,
'delete_posts' => false,
));
}
register_activation_hook(__FILE__, 'add_roles_on_activation');
function add_roles_removal() // limpiamos después de nosotros
{
remove_role('contributor');
}
register_deactivatin_hook(__FILE__, 'add_roles_removal');
Ahora si solo quieres eliminar elementos del menú (haciéndolos accesibles por URL de todos modos) aquí está cómo:
Desde la barra de administración (ese pequeño menú flotante superior):
function my_edit_adminbar($wp_admin_bar)
{
if(current_user_can('read_myposttype'))
$wp_admin_bar->remove_node('new-myposttype');
}
add_action('admin_bar_menu', 'my_edit_adminbar');
Desde el menú:
function my_edit_menu()
{
if(current_user_can('read_myposttype'))
{
$slug = 'edit.php?post_type=myposttype';
remove_menu_page($slug);
}
}
add_action('admin_menu', 'my_edit_menu');

Bueno... no veo ningún código... así que no sé si creaste el tipo de entrada personalizado tú mismo o usaste un plugin. Estoy asumiendo que creaste el tipo de entrada personalizado en functions.php. Allí puedes tener una declaración if para verificar si el usuario tiene ciertas capacidades.
<?php current_user_can( $capability, $args ); ?>
Realmente ayudaría si pudieras publicar algo de código, para que pueda dar un ejemplo específico de cómo hacer esto.
http://codex.wordpress.org/Function_Reference/current_user_can

En primer lugar, aquí te muestro cómo podemos obtener el rol del usuario actual.
<?php
// Obtener el ID del usuario actual
$user_id = get_current_user_id();
// Obtener los datos del usuario basados en este ID
// devueltos en un array
$user_data = new WP_User( $user_id );
// Podríamos mostrar el primer elemento del rol
// en el array así...
echo $user->roles[0];
// O podríamos imprimir todo el
// array de esta manera
print_r($user->roles);
?>
Ahora podríamos usar los datos anteriores para construir una simple declaración condicional en las plantillas. Esto variará dependiendo de lo que estés intentando lograr, pero...
<?php
$user_roll = $user->roles[0];
if($user_roll =="administrator") {
// El código aquí solo se ejecutará si el usuario
// actual es un administrador
}
?>
Ya captas la idea ;)

Al registrar un Custom Post Type (CPT) utilizamos el hook de acción init
:
add_action( 'init', 'mi_funcion_de_tipo_de_entrada_personalizado', 0 );
Lo que necesitamos es colocar una condición de rol de usuario alrededor de este registro específico de CPT en dos pasos:
1. Tener una función que devuelva el rol del usuario actual como una cadena
function mi_obtener_rol_de_usuario_actual() {
$usuario = wp_get_current_user();
$roles = (array)$usuario->roles;
return $roles[0];
}
2. Luego restringir
if(mi_obtener_rol_de_usuario_actual() == 'administrator'){
add_action( 'init', 'mi_funcion_de_tipo_de_entrada_personalizado', 0 );
}
