This has to do with creating hierarchical CPTs, so you can have ‘sub-posts’ as children of a CPT single.
// Fake pages' permalinks and titles. Change these to your required sub pages. $my_fake_pages = array( 'reviews' => 'Reviews', 'purchase' => 'Purchase', 'author' => 'Author Bio' ); add_filter('rewrite_rules_array', 'fsp_insertrules'); add_filter('query_vars', 'fsp_insertqv'); // Adding fake pages' rewrite rules function wpse_261271_insertrules($rules) { global $my_fake_pages; $newrules = array(); foreach ($my_fake_pages as $slug => $title) $newrules['books/([^/]+)/' . $slug . '/?$'] = 'index.php?books=$matches[1]&fpage=' . $slug; return $newrules + $rules; } // Tell WordPress to accept our custom query variable function wpse_261271_insertqv($vars) { array_push($vars, 'fpage'); return $vars; } // Remove WordPress's default canonical handling function remove_filter('wp_head', 'rel_canonical'); add_filter('wp_head', 'fsp_rel_canonical'); function wpse_261271_rel_canonical() { global $current_fp, $wp_the_query; if (!is_singular()) return; if (!$id = $wp_the_query->get_queried_object_id()) return; $link = trailingslashit(get_permalink($id)); // Make sure fake pages' permalinks are canonical if (!empty($current_fp)) $link .= user_trailingslashit($current_fp); echo '<link rel="canonical" href="'.$link.'" />'; }
Reference Links
http://www.placementedge.com/blog/create-post-sub-pages/
https://wordpress.stackexchange.com/questions/260952/create-sub-single-pages