Create a hierarchical Custom Post Type in WordPress
Intermediate
Creating a hierarchical custom post type is not difficult but it has one trick. Besides you need to set hierarchical to true. You must also add supports array support for ‘page-attributes’. Without this page-attributes menu won’t appear in backend and you can’t give your post a parent. I struggle to figure this out for a while.
Here’s a code to add to your functions.php or plugin.
//BOOKS HIERARCHICAL POST TYPE
function xiong_register_books_post_type () {
//Variables
$singular = 'Book';
$plural = 'Books';
$object = 'book';
$labels = array(
'name' => $plural,
'singular_name' => $singular,
'add_name' => 'Add new',
'add_new_item' => 'Add new ' . $singular,
'edit' => 'Edit',
'edit_item' => 'Edit ' . $object,
'new_item' => 'New ' .$singular,
'view' => 'Show ' . $singular,
'view_item' => 'Show ' . $singular,
'search_term' => 'Search ' . $object,
'not_found' => 'Could not find that ' . $object,
'not_found_in_trash' => 'Could not find that ' . $object . ' from trash'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'exclude_from_search'=> false,
'show_ui' => true,
'show_in_menu' => true,
'show_in_admin_bar' => true,
'menu_position' => 20,
'menu_icon' => 'dashicons-book',
'can_export' => true,
'delete_with_user' => false,
'hierarchical' => true, //IMPORTANT!!!
'has_archive' => true,
'query_var' => true,
'capability_type' => 'page',
'map_meta_cap' => true,
'rewrite' => array(
'slug' => 'book',
'with_front' => true,
'pages' => true, //pagination
'feeds' => false //rss
),
'supports' => array(
'title',
'editor',
'author',
'thumbnail',
'excerpt',
'custom-fields',
'comments',
'page-attributes' //IMPORTANT!!!
)
);
register_post_type('books', $args );
}
add_action('init', 'xiong_register_books_post_type' );