san_jorich
@san_jorich
Творческий кодер

Страницу Произольного Типа Записи для для кастомных ролей нужно добавлять отдельно?

Здравствуй, toster!
Начал выключать из админки wordpress все лишнее, для отдельных типов пользователей, определяя их по ролям. Все работает хорошо. Даже слишком - и в этом проблемма.
У меня созданно несколько произвольных типов записей (CPT), и по идее я их не выключаю.. но их нет ! Их нужно добавлять отдельно?
Функция кастомизации(условно) админки
function users_dashboard() {

        $current_user   = wp_get_current_user();
        $role_name      = $current_user->roles[0];

        switch ($role_name) {
            case 'ae_manager': manager_navigation(); break;
        }
}
add_action( 'admin_init', 'users_dashboard' );

function manager_navigation() {
   global $menu;
   remove_menu_page( 'index.php' );                  
   //remove_menu_page( 'edit.php' );                 
   //remove_menu_page( 'edit.php?post_type=page' );  
   remove_menu_page( 'edit-comments.php' );          
   remove_menu_page( 'themes.php' );                 
   remove_menu_page( 'plugins.php' );                
   remove_menu_page( 'users.php' );                  
   remove_menu_page( 'tools.php' );                  
   remove_menu_page( 'options-general.php' );        
   remove_meta_box( 'dashboard_incoming_links', 'dashboard', 'normal' );
   remove_meta_box( 'dashboard_plugins', 'dashboard', 'normal' );
   remove_meta_box( 'dashboard_primary', 'dashboard', 'normal' );
   remove_meta_box( 'dashboard_secondary', 'dashboard', 'normal' );
   remove_meta_box( 'dashboard_incoming_links', 'dashboard', 'normal' );
   remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' );
   remove_meta_box( 'dashboard_recent_drafts', 'dashboard', 'side' );
   remove_meta_box( 'dashboard_recent_comments', 'dashboard', 'normal' );
   remove_meta_box( 'dashboard_right_now', 'dashboard', 'normal' );
   remove_meta_box( 'dashboard_activity', 'dashboard', 'normal');
    
}

Ссылка на страницы типов записей:
/wp-admin/edit.php?post_type=estate
/wp-admin/edit.php?post_type=agency_operations
Функции регистрации одного из CPT. Второй тип анологичный, со своими таксономиями и названием..
// Регистрация Объектов недвижимости
if ( ! function_exists('estate_post_type') ) {

function estate_post_type() {

    $labels = array(
        'name'                  => _x( 'Объекты недвижимости', 'estate' ),
        'singular_name'         => _x( 'Объекты', 'estate' ),
        'menu_name'             => __( 'Объекты недвижимости', 'estate' ),
        'name_admin_bar'        => __( 'Объект', 'estate' ),
        'archives'              => __( 'Архивные объекты', 'estate' ),
        'attributes'            => __( 'Аттрибуты Объекта', 'estate' ),
        'parent_item_colon'     => __( 'Главный Объект:', 'estate' ),
        'all_items'             => __( 'Все Объекты', 'estate' ),
        'add_new_item'          => __( 'Добавить новый объект', 'estate' ),
        'add_new'               => __( 'Добавить новый объект', 'estate' ),
        'new_item'              => __( 'Новый Объект', 'estate' ),
        'edit_item'             => __( 'Редактировать Объект', 'estate' ),
        'update_item'           => __( 'Обновиить Объект', 'estate' ),
        'view_item'             => __( 'Просмотеть Объект', 'estate' ),
        'view_items'            => __( 'Просмотреть Объект', 'estate' ),
        'search_items'          => __( 'Найти Объект', 'estate' ),
        'not_found'             => __( 'Объектов нахрен нет', 'estate' ),
        'not_found_in_trash'    => __( 'Корзина Объектов пуста', 'estate' ),
        'featured_image'        => __( 'Изображение Объекта', 'estate' ),
        'set_featured_image'    => __( 'Установить изображение Объекта', 'estate' ),
        'remove_featured_image' => __( 'Удалить изображение Объекта', 'estate' ),
        'use_featured_image'    => __( 'Все изображения Объекта', 'estate' ),
        'insert_into_item'      => __( 'Добавить в Объект', 'estate' ),
        'uploaded_to_this_item' => __( 'Прикрепить к этому Объекту', 'estate' ),
        'items_list'            => __( 'Объект-лист', 'estate' ),
        'items_list_navigation' => __( 'Объект-лист', 'estate' ),
        'filter_items_list'     => __( 'Фильтр Объектов', 'estate' ),
    );
    $args = array(
        'label'                 => __( 'Объекты', 'estate' ),
        'description'           => __( 'Объекты недвижимости.', 'estate' ),
        'labels'                => $labels,
        'supports'              => array( 'title', /*'editor',*/ 'revisions', 'thumbnail' ),
        'taxonomies'            => array( 'estate_type', 'estate_operation', 'estate_district', 'estate_building_type', 'estate_class'),
        'hierarchical'          => false,
        'public'                => true,
        'show_ui'               => true,
        'show_in_menu'          => true,
        'menu_position'         => 5,
        'menu_icon'             => 'dashicons-admin-home',
        'show_in_admin_bar'     => true,
        'show_in_nav_menus'     => true,
        'can_export'            => true,
        'has_archive'           => true,
        'exclude_from_search'   => true,
        'publicly_queryable'    => true,
        'capability_type'       => 'page',
    );
    register_post_type( 'estate', $args );

}
add_action( 'init', 'estate_post_type', 0 );

}
Функция регистрации роли
/* Роль: Менеджер */ 
register_activation_hook( __FILE__, 'create_ae_manager_role' );
function create_ae_manager_role(){
  $new_role = add_role('ae_manager', 'Менеджер агенства', array(
      'upload_files' => true,
      'edit_posts' => true,
      'edit_published_posts' => true,
      'publish_posts' => true,
      'read' => true,
      'delete_posts' => false,
      'delete_published_posts' => true,
      'moderate_comments'=> true,
    )
  );  
}
register_deactivation_hook( __FILE__, 'delete_manager_role' );
function delete_manager_role(){  remove_role( 'ae_manager' ); }

Что я не так сделал? Помогите,пожалуйста.. все глаза просмотрел насквозь..
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
У вас при регистрации custom post type стоит 'capability_type' => 'page',. Это генерит capabilities вида "edit_pages", "publish_pages" и тд. А при создании роли вы указали "edit_posts", "publish_posts". Capabilities разные.

И вообще, если уж регистрировать custom post type с мыслью о дальнейшем контроле доступа, то генерите свои произвольные capabilities, в данном примере это будет "'capability_type' => 'estate',", далее назначайте эти capabilities нужным ролям. Почитайте еще про map_meta_cap.

Именно ролями с корректно выставленными capabilities можно контролировать что юзер может делать в админке, а что нет. С помощью remove_menu_page( 'plugins.php' ); вы только убираете ссылку из меню, сама страница остается и она доступна. Зайдя по ее прямому адресу пользователь все равно сможет админить плагины. Огромная дырка тут у вас :) В документации же черным по белому написано:

Please be aware that this would not prevent a user from accessing these screens directly. Removing a menu does not replace the need to filter a user's permissions as appropriate.


Правильный способ закрыть юзеру доступ к определенным фичам - убрать у него соответствующую capability, в случае с плагинами это будет:

- activate_plugins
- delete_plugins
- edit_plugins
- install_plugins
- update_plugins

Полный список ролей и их capabilities есть в документации.

В общем, вам обратно за парту надо. Разобраться в тонкостях roles и capabilities, map_meta_cap и тд. Иначе вы соберете франкенштейна.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
san_jorich
@san_jorich Автор вопроса
Творческий кодер
Игорь Воротнёв , с типами вроде решил.. теперь таже штука с таксономиями, будь они
Регистрация таксономии
function es_event_types_taxonomy() {

    $labels = array(
        'name'                       => 'Тип',
        'singular_name'              => 'Тип мероприятия',
        'menu_name'                  => 'Тип мероприятия',
        'all_items'                  => 'Все типы мероприятий',
        'parent_item'                => 'Главный тип мероприятия',
        'parent_item_colon'          => 'Parent Item:',
        'new_item_name'              => 'Название нового типа мероприятий',
        'add_new_item'               => 'Добавить тип мероприятия',
        'edit_item'                  => 'Редактировать тип',
        'update_item'                => 'Обновить тип',
        'view_item'                  => 'Смотреть тип',
        'separate_items_with_commas' => 'Добавление через запятую',
        'add_or_remove_items'        => 'Добавить или удалить тип мероприятий',
        'choose_from_most_used'      => 'Выбрать из наиболее популярных',
        'popular_items'              => 'Популярные типы',
        'search_items'               => 'Найти тип',
        'not_found'                  => 'Тип не найден',
        'no_terms'                   => 'Типов мероприятий нет.',
        'items_list'                 => 'Список типов меропрриятий',
        'items_list_navigation'      => 'Items list navigation',
    );

   
    $es_type_capabilities = array(
        'manage_terms' => 'manage_es_event_type',
        'edit_terms' => 'edit_es_event_type',
        'delete_terms' => 'delete_es_event_type',
        'assign_terms' => 'assign_es_event_type',
    );

    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => true,
        'show_in_quick_edit'         => true,
        'meta_box_cb'                => true,
        'capabilities'               => $es_type_capabilities, 
    );
    register_taxonomy( 'es_event_type', array( 'es_event' ), $args );

}
add_action( 'init', 'es_event_types_taxonomy', 0 );

/* В права роли соответственно добавил

   'manage_es_event_type'	=>	true,
    'edit_es_event_type'	=>	true,
    'delete_es_event_type'	=>	true,
    'assign_es_event_type'	=>	true,
*/

Не работает..
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы