Удаление меню пользовательского типа записи для пользователей без прав администратора
Я целый день исследовал этот вопрос, но не нашел подходящего решения.
Я хочу ограничить видимость моих пользовательских типов записей в зависимости от уровня пользователя (или другим способом). Чтобы если вошедший пользователь не является 'администратором', добавленные пользовательские типы записей не были ему видны.
Вот часть моего кода для пользовательского типа записи:
add_action('init', 'portfolio_register');
function portfolio_register() {
$labels = array(
'name' => _x('Кейсы', 'название типа записи'),
'singular_name' => _x('Элемент кейса', 'название отдельного элемента'),
'add_new' => _x('Добавить новый', 'элемент портфолио'),
'add_new_item' => __('Добавить новый элемент кейса'),
'edit_item' => __('Редактировать элемент кейса'),
'new_item' => __('Новый элемент кейса'),
'view_item' => __('Просмотреть элемент кейса'),
'search_items' => __('Искать кейсы'),
'not_found' => __('Ничего не найдено'),
'not_found_in_trash' => __('В корзине ничего не найдено'),
'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 );
}
Вот потенциальные решения, которые я нашел, но они не работают для скрытия меню пользовательского типа записи:
function remove_menus()
{
global $menu;
global $current_user;
get_currentuserinfo();
if($current_user->user_login != 'admin')
{
$restricted = array(__('Записи'),
__('Медиафайлы'),
__('Ссылки'),
__('Страницы'),
__('Комментарии'),
__('Внешний вид'),
__('Плагины'),
__('Пользователи'),
__('Инструменты'),
__('Настройки')
);
end ($menu);
while (prev($menu)){
$value = explode(' ',$menu[key($menu)][0]);
if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
}// end while
}// end if
}
add_action('admin_menu', 'remove_menus');
Этот код работает для удаления стандартных пунктов меню, но я не смог заставить его удалить меню пользовательского типа записи. Кроме того, он зависит от имени пользователя, что нормально, если бы я мог добавить несколько пользователей.
global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) {
.......
}
Этот вариант вообще не сработал.
Спасибо.
Кодекс - Регистрация типа записи
Смотрите аргументы capability_type
и capabilities
для функции register_post_type
.
Вы можете передать в аргумент capabilities
массив возможностей для сопоставления с необходимыми правами. Вот пример массива аргументов с пользовательскими возможностями.
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'rewrite' => true,
'capabilities' => array(
'publish_posts' => 'ADD_CAP_HERE',
'edit_posts' => 'ADD_CAP_HERE',
'edit_others_posts' => 'ADD_CAP_HERE',
'delete_posts' => 'ADD_CAP_HERE',
'delete_others_posts' => 'ADD_CAP_HERE',
'read_private_posts' => 'ADD_CAP_HERE',
'edit_post' => 'ADD_CAP_HERE',
'delete_post' => 'ADD_CAP_HERE',
'read_post' => 'ADD_CAP_HERE',
),
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','thumbnail')
);
Вы, конечно, должны заменить ADD_CAP_HERE
на конкретную возможность. Если вы хотите ограничить этот тип записи только для администраторов, просто используйте возможность, доступную только администраторам, например manage_options
.
Таблица ролей и их возможностей (для быстрого ознакомления).
http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table

Не могли бы вы объяснить, что означает ADD_CAP_HERE
? Мне нужно скрыть меню моего пользовательского типа записей от редакторов; Ваш код не помог скрыть пункт меню :(

@numediaweb -- На странице http://codex.wordpress.org/Roles_and_Capabilities вы найдёте список возможностей для роли 'Редактор' и выше, например 'edit_dashboard' (что должно сработать в вашем случае)

Хорошо, после дополнительных поисков в Google я наконец нашел ответ и объединил его с одним из скриптов выше, чтобы создать то, что мне нужно. Ниже приведен мой код на случай, если кто-то еще ищет подобное решение:
global $user_login;
get_currentuserinfo();
if (!current_user_can('update_plugins')) {
.....
}
Этот код получает уровень текущего пользователя, и если у него есть права на обновление/редактирование плагинов, то он получает доступ к заключенным функциям.
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' );
Этот код позволяет удалить пользовательские типы записей из меню администратора. Вы можете добавить столько переменных $key
, сколько вам нужно. Вместо того чтобы подробно объяснять, что делает этот код, вы можете прочитать оригинальную статью.

Я не знаю, в чем проблема с кодом, но когда мне нужно ограничить пункты меню для пользователей, я использую: Admin Menu Editor — это плагин, который делает именно это за вас.

Спасибо за ответ, но это не совсем то, что мне нужно. Это позволяет перемещать пункты меню и все такое, но не позволяет скрывать пункты меню для пользователей без прав администратора. К тому же, я бы предпочел не использовать плагин для этого. Спасибо.
