Remove custom post type slug not working for child pages
I'd like my custom post type, products, to not use a slug, eg: domain.com/product-name. The code below sorts that out nicely, however it fails to work with child pages, eg: domain.com/product-name/product-name-feature, it 404s.
I originally tried giving the custom post type the rewrite slug as '/', and while this was great for the custom post type, it killed normal pages (404). So if the solution is to use '/' and then fix normal pages, that's fine too.
// Post Type
function base_types() {
$labels = array(
'name' = 'Products Features',
'singular_name' = 'Product',
'add_new' = 'Add New',
'add_new_item' = 'Add New Product / Feature',
'edit_item' = 'Edit Product',
'new_item' = 'New Product',
'all_items' = 'All',
'view_item' = 'View Product / Feature',
'search_items' = 'Search Product / Feature',
'not_found' = 'None found',
'not_found_in_trash' = 'None found in Trash',
'parent_item_colon' = '',
'menu_name' = 'Products / Features'
);
$args = array(
'labels' = $labels,
'public' = true,
'publicly_queryable' = true,
'show_ui' = true,
'show_in_menu' = true,
'query_var' = true,
'rewrite' = array( 'slug' = 'product', 'with_front' = false ),
'capability_type' = 'page',
'has_archive' = false,
'hierarchical' = true,
'menu_position' = 10,
'with_front' = false,
'menu_icon' = 'dashicons-chart-bar',
'supports' = array( 'title', 'editor', 'author', 'page-attributes' )
);
register_post_type( 'product', $args );
}
add_action( 'init', 'base_types' );
// Rewrites
function remove_slug( $post_link, $post, $leavename ) {
if ( 'product' != $post-post_type || 'publish' != $post-post_status ) {
return $post_link;
}
if( $post-post_parent ) {
$parent = get_post($post-post_parent);
$post_link = str_replace( '/' . $post-post_type . '/' . $parent-post_name . '/', '/' . $parent-post_name . '/', $post_link );
}
else {
$post_link = str_replace( '/' . $post-post_type . '/', '/', $post_link );
}
return $post_link;
}
add_filter( 'post_type_link', 'remove_slug', 10, 3 );
function parse_request( $query ) {
if ( ! $query-is_main_query() || 2 != count( $query-query ) || ! isset( $query-query['page'] ) ) {
return;
}
if ( ! empty( $query-query['name'] ) ) {
$query-set( 'post_type', array( 'post', 'product', 'page' ) );
}
}
add_action( 'pre_get_posts', 'parse_request' );
First level pages work as expected. The child pages get the correct permalink, but they 404.
Can anyone help or point in the right direction? Thank you.
Topic rewrite-rules child-pages url-rewriting custom-post-types Wordpress
Category Web