There is a simpler and lighter solution:
First: set the slug argument for your custom post type to “https://wordpress.stackexchange.com/” when registering the post type:
add_action( 'init', 'register_my_post_type' );
function register_my_post_type() {
$args = array(
//The rest of arguments you are currently using goes here
'rewrite' => array(
'slug' => "https://wordpress.stackexchange.com/"
)
);
register_post_type( 'my-post-type', $args );
}
Second: in preg_get_posts()
action hook include your post type in the query when only the $query->query['name']
is present:
add_action( 'pre_get_posts', 'wpse_include_my_post_type_in_query' );
function wpse_include_my_post_type_in_query( $query ) {
// Only noop the main query
if ( ! $query->is_main_query() )
return;
// Only noop our very specific rewrite rule match
if ( 2 != count( $query->query )
|| ! isset( $query->query['page'] ) )
return;
// Include my post type in the query
if ( ! empty( $query->query['name'] ) )
$query->set( 'post_type', array( 'post', 'page', 'my-post-type' ) );
}
Third: I’ve found that in some situations there are conflicts with pages and single posts. I’ve been able to avoid this conflict by checking if a page with the request name exists and overriding the query conditionals but I’m not sure if more conflict can happens:
add_action( 'parse_query', 'wpse_parse_query' );
function wpse_parse_query( $wp_query ) {
if( get_page_by_path($wp_query->query_vars['name']) ) {
$wp_query->is_single = false;
$wp_query->is_page = true;
}
}
IMPORTANT: You need to flush the rewrite rules. You can do it by viviting the permalink options page in the admin area. This is needed because we are registering a new rewrite rule, so the current rewrite rules stored in the database must be regenerated.