Okay
  Print

Remove slug from custom post type post URLs?

The following code will work, but you just have to keep in mind that conflicts can happen easily if the slug for your custom post type is the same as a page or post's slug...

First, we will remove the slug from the permalink:

function archi_remove_slug( $post_link, $post, $leavename ) {
    if ( 'service' != $post->post_type || 'publish' != $post->post_status ) {        return $post_link;    }
    $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
    return $post_link;
}
add_filter( 'post_type_link', 'archi_remove_slug', 10, 3 );

Just removing the slug isn't enough. Right now, you'll get a 404 page because WordPress only expects posts and pages to behave this way. You'll also need to add the following:

function archi_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', 'service', 'page' ) );    }
}
add_action( 'pre_get_posts', 'archi_parse_request' );

Just change "service" to your custom post type and you're good to go. You may need to refresh your permalinks.