Удаление меню пользовательского типа записи для пользователей без прав администратора

19 янв. 2011 г., 23:06:13
Просмотры: 18.7K
Голосов: 2

Я целый день исследовал этот вопрос, но не нашел подходящего решения.

Я хочу ограничить видимость моих пользовательских типов записей в зависимости от уровня пользователя (или другим способом). Чтобы если вошедший пользователь не является 'администратором', добавленные пользовательские типы записей не были ему видны.

Вот часть моего кода для пользовательского типа записи:

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')) {
      .......
   }

Этот вариант вообще не сработал.

Спасибо.

0
Все ответы на вопрос 3
2
14

Кодекс - Регистрация типа записи

Смотрите аргументы 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

20 янв. 2011 г. 15:27:19
Комментарии

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

numediaweb numediaweb
21 июл. 2014 г. 00:07:57

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

Douglas.Sesar Douglas.Sesar
8 дек. 2014 г. 16:44:39
1

Хорошо, после дополнительных поисков в 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, сколько вам нужно. Вместо того чтобы подробно объяснять, что делает этот код, вы можете прочитать оригинальную статью.

20 янв. 2011 г. 12:57:36
Комментарии

Будьте осторожны при использовании плагина Woocommerce, так как он переопределяет опцию фильтрации меню! Я исправил это, добавив add_filter( 'custom_menu_order' , '__return_true', 999);

numediaweb numediaweb
21 июл. 2014 г. 00:41:40
2

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

20 янв. 2011 г. 01:10:53
Комментарии

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

jetDL jetDL
20 янв. 2011 г. 12:33:14

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

User User
5 янв. 2012 г. 18:39:48