Kemampuan dan Jenis Posting Kustom

30

Saya memiliki jenis posting khusus yang ingin saya batasi akses ke peran tertentu. Namun, saya sudah menambahkan konten menggunakan jenis posting kustom dan sekarang saya harus membuatnya terbatas. Kapabilitas_type adalah 'posting'

'capability_type' => 'post'

Namun yang manakah yang baik sebagai konten muncul di backend, sekarang segera setelah saya menambahkan kemampuan konten menghilang dari backend?

Saya sudah mencoba menyesuaikan tipe kemampuan untuk memasukkan definisi jamak untuk membuat sendiri, tetapi segera setelah saya menghapus atau mengubah tipe kemampuan, itu hilang!

kode lengkap:

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),

    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,

    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    )
);

register_post_type( 'gallery', $args );
}

Saya juga telah menguji ini dengan jenis posting kustom yang sama sekali baru dan terlepas dari jenis kemampuan saya mendapatkan masalah yang sama misalnya bahkan jika saya menghapusnya dan menambahkan yang khusus saya:

'capability_type' => array('movie','movies');
erichmond
sumber

Jawaban:

40

Setelah obrolan cepat dengan Magicroundabout yang menunjukkan sumber daya yang bermanfaat dari Justin Tadlock , ternyata kemampuan untuk jenis posting kustom tidak benar-benar ada kecuali jika Anda menggunakan add_cap ke peran, misalnya untuk jenis posting kustom berikut:

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    ),
    // as pointed out by iEmanuele, adding map_meta_cap will map the meta correctly 
    'map_meta_cap' => true
);

register_post_type( 'gallery', $args );
}

kemampuan tambahan harus ditambahkan ke peran agar izin benar-benar berfungsi di backend, termasuk 'administrator' - misalnya:

function add_theme_caps() {
    // gets the administrator role
    $admins = get_role( 'administrator' );

    $admins->add_cap( 'edit_gallery' ); 
    $admins->add_cap( 'edit_galleries' ); 
    $admins->add_cap( 'edit_other_galleries' ); 
    $admins->add_cap( 'publish_galleries' ); 
    $admins->add_cap( 'read_gallery' ); 
    $admins->add_cap( 'read_private_galleries' ); 
    $admins->add_cap( 'delete_gallery' ); 
}
add_action( 'admin_init', 'add_theme_caps');

Saya harap ini bermanfaat bagi orang lain.

erichmond
sumber
11
add_theme_caps()harus dipanggil satu kali saja, tidak setiap kali halaman admin dimuat. Akan lebih baik digunakan switch_themesebagai hook untuk aktivasi tema atau register_activation_hookaktivasi plugin.
d79
Bagus! Saya suka menggunakan wp cli untuk menambahkan kemampuan jika itu adalah situs yang sepenuhnya khusus / unik karena ini adalah tindakan yang hanya perlu dilakukan sekali.
squarecandy
8

Menambahkan:

map_meta_cap => true

ke array $ args Anda. Lihat di sini , untuk lebih banyak. Semoga ini bisa membantu!

iEmanuele
sumber
1
Inilah yang saya pikirkan juga tetapi tidak sepenuhnya demikian.
erichmond
Ini berhasil untuk saya
Shikyo
1

IMHO Anda tidak pernah memetakan kemampuan Anda sendiri. Pastikan untuk menggunakan plugin meta cap peta untuk melakukannya. http://codex.wordpress.org/Function_Reference/map_meta_cap

Saya menghabiskan waktu berhari-hari untuk memetakan topi khusus saya secara manual dengan kode. Cukup instal plugin itu, petakan topi Anda dan nonaktifkan sekali berfungsi. Jika membuat peran khusus, Anda AKAN membutuhkan plugin Anggota .

Cara saya menguji untuk membuat yakin peran saya memiliki kapabilit tersebut (kadang-kadang Anda bersumpah Anda melakukannya tetapi tidak benar-benar) membuat halaman debugging dengan:

    if( !function_exists( 'current_user_has_role' ) ){
        function current_user_has_role( $role ){
            $current_user = new WP_User( wp_get_current_user()->ID );
            $user_roles = $current_user->roles;
            $is_or_not = in_array( $role, $user_roles );
            return $is_or_not;
        }
    }

Ini akan menunjukkan kepada Anda kemampuan yang sebenarnya Anda miliki.

Ben Racicot
sumber
-1

Untuk Jenis Pos Kustom, Saya TIDAK menyarankan menggunakan kait:

add_action( 'registered_post_type', 'your_func', 10, 2 );

alih-alih saya sarankan menggunakan:

add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name ) 
{
   if ( $name == "your_custom_post_name" ) 
   ...
}
T.Todua
sumber
saran itu bagus, tetapi tidak menjawab pertanyaan.
Aurovrata