Puede usar el enlace get_terms
para buscar todas las categorías y restringir el acceso a ellas por ID o por slug, si el usuario actual no es un administrador, o en este caso específico si el usuario no tiene el rol asignado por tú.
add_filter('get_terms', 'restrict_categories');
function restrict_categories($categories) {
$onPostPage = (strpos($_SERVER['PHP_SELF'], 'post.php') || strpos($_SERVER['PHP_SELF'], 'post-new.php')); // check if we are in the new/edit post page
// if (is_admin() && $onPostPage && !current_user_can('level_10')) { // check for user capabilities - level_10 is admin
if (is_admin() && $onPostPage && themename_check_user_role( 'category_restricted' )) { // check for user role
$size = count($categories);
for ($i = 0; $i < $size; $i++) {
// if ($categories[$i]->slug != 'category_slug')
if ($categories[$i]->term_id != '1') // then restrict the categories by ID
unset($categories[$i]);
}
}
return $categories;
}
Los créditos para el código van a: wptricks . Acabo de recordar que leí sobre esto hace un tiempo.
Edición posterior:
Puede intentar pasar un rol a la función current_user_can()
, pero no se garantiza que funcione correctamente, en su lugar, puede usar la siguiente función para verificar los roles de los usuarios.
/**
* Checks if a particular user has a role.
* Returns true if a match was found.
*
* @param string $role Role name.
* @param int $user_id (Optional) The ID of a user. Defaults to the current user.
* @return bool
*/
function themename_check_user_role( $role, $user_id = null ) {
if ( is_numeric( $user_id ) )
$user = get_userdata( $user_id );
else
$user = wp_get_current_user();
if ( empty( $user ) )
return false;
return in_array( $role, (array) $user->roles );
}
// example use for the current user
if ( themename_check_user_role( 'customer' )
_e( "You've got access!", 'themename' );
else
_e( "Sorry, you don't have access!", 'themename' );
Y como nota al margen, es una buena idea incluir su función add_role
en la activación del tema / complemento.