Batasi jenis pos khusus hanya untuk peran administrator situs

17

Bagaimana saya bisa menghapus jenis posting khusus ini agar tidak ditampilkan di dashboard untuk pengguna non admin?

/* Add Websites Custom Post Type */
add_action( 'init', 'create_website_type' );
function create_website_type() {

    register_post_type( 'website',
        array(
            'labels' => array(
                'name' => __( 'Websites' ),
                'singular_name' => __( 'Website' ),
                'add_new' => __( 'Add New Website' ),
                'add_new_item' => __( 'Add New Website' ),
                'edit' => __( 'Edit Website' ),             
                'edit_item' => __( 'Edit Website' ),                
                'new_item' => __( 'Add New Website' ),              
                'view' => __( 'View Website' ),         
                'view_item' => __( 'View Website' ),                    
                'search_items' => __( 'Search Websites' ),  
                'not_found' => __( 'No Websites Found' ),
                'not_found_in_trash' => __( 'No Websites found in Trash' ),                                         
            ),
            'description' => __('Websites to be shown in Resources section.'),
            'public' => true,
            'show_ui' => true,
            'publicly_queryable' => true,
            'exclude_from_search' => false,
            'menu_position' => 20,
            'supports' => array('title', 'editor'),
            'can_export' => true        
        )
    ); 
    remove_post_type_support('website','editor'); 
}
urok93
sumber

Jawaban:

13

register_post_type()menerima parameter capabilitiesdalam argumennya. Lihat get_post_type_capabilities()kemungkinan nilainya. Dari komentar:

Secara default, tujuh kunci diterima sebagai bagian dari susunan kemampuan:

  • edit_post,, read_postdan delete_postmerupakan kemampuan meta, yang kemudian umumnya dipetakan ke kemampuan primitif yang sesuai tergantung pada konteksnya, yang akan menjadi pos yang sedang diedit / baca / hapus dan pengguna atau peran sedang diperiksa. Dengan demikian kemampuan ini umumnya tidak akan diberikan langsung kepada pengguna atau peran.

  • edit_posts - Mengontrol apakah objek jenis posting ini dapat diedit.

  • edit_others_posts- Mengontrol apakah objek jenis ini yang dimiliki oleh pengguna lain dapat diedit. Jika jenis posting tidak mendukung penulis, maka ini akan berperilaku seperti edit_posts.
  • publish_posts - Kontrol objek penerbitan jenis posting ini.
  • read_private_posts - Mengontrol apakah objek pribadi dapat dibaca.

Keempat kemampuan primitif ini diperiksa di inti di berbagai lokasi. Ada juga tujuh kemampuan primitif lainnya yang tidak direferensikan langsung di inti, kecuali di map_meta_cap(), yang mengambil tiga kemampuan meta yang disebutkan di atas dan menerjemahkannya menjadi satu atau lebih kemampuan primitif yang kemudian harus diperiksa terhadap pengguna atau peran, tergantung pada konteksnya.

  • read - Mengontrol apakah objek jenis posting ini dapat dibaca.
  • delete_posts - Mengontrol apakah objek jenis posting ini dapat dihapus.
  • delete_private_posts - Mengontrol apakah objek pribadi dapat dihapus.
  • delete_published_posts - Kontrol apakah objek yang dipublikasikan dapat dihapus.
  • delete_others_posts- Mengontrol apakah objek yang dimiliki oleh pengguna lain dapat dihapus. Jika jenis posting tidak mendukung penulis, maka ini akan berperilaku seperti delete_posts.
  • edit_private_posts - Mengontrol apakah objek pribadi dapat diedit.
  • edit_published_posts - Mengontrol apakah objek yang dipublikasikan dapat diedit.

Kemampuan tambahan ini hanya digunakan di map_meta_cap(). Dengan demikian, mereka hanya ditugaskan secara default jika jenis posting terdaftar dengan 'map_meta_cap'argumen diatur ke true(standarnya adalah false).

Dalam argumen pendaftaran Anda, tambahkan:

'capabilities' => array(
    'edit_post'          => 'update_core',
    'read_post'          => 'update_core',
    'delete_post'        => 'update_core',
    'edit_posts'         => 'update_core',
    'edit_others_posts'  => 'update_core',
    'delete_posts'       => 'update_core',
    'publish_posts'      => 'update_core',
    'read_private_posts' => 'update_core'
),
fuxia
sumber
Bagaimana Anda akan melakukan hal yang sama tetapi membiarkan administrator dan editor mengakses cpt?
urok93
@ drtanz Berikan kemampuan khusus, dan filter user_has_cap. Lihat jawaban ini sebagai contoh.
fuxia
Bisakah saya melakukannya dengan cara yang sama seperti yang Anda sarankan, tetapi menempatkan kemampuan manage_links (dibagi antara admin dan editor) alih-alih update_core?
urok93
@ Drtanz Ya, tapi saya akan menggunakan kemampuan khusus. Pengelola tautan akan dihapus pada akhirnya, dan Anda tidak tahu apa yang terjadi pada kemampuan yang ditugaskan saat itu.
fuxia
2
Catatan tentang update_core; Hanya Administrator dari satu instalasi situs yang memiliki kemampuan ini. Di Multisite, hanya Admin Super yang memiliki kemampuan ini.
numediaweb