Убираем имя произвольного типа записи из URL

Для начала стоит заметить, что ниже приведенный способ работает в случаях, когда настройки ЧПУ в установлены как /%postname%
И так, если ваша схема произвольных ссылок именно так и настроена, перейдем непосредственно к коду.
Приступим:
Предположим мы зарегистрировали наш произвольный тип записей:
/**
 * Register a custom post type
 */
$args = array(
    'description' => 'Photograph Post Type',
    'label' => __('Photographs'),
    'public' => true,
    'rewrite' => array( 'slug' => 'photograph'),
);
register_post_type( 'photograph' , $args );
Посоле этого все статьи данного типа будут доступны по следующему адресу /photograph/имя_записи.
Далее, чтоб избавиться от имени типа записи в URL мы будем использовать функцию, которая будет проверять:
Если запись относится к нашему типу записи - значит убираем из ее URL ярлык (slug) типа записи
/**
 * Remove the slug from published post permalinks.
 */
function custom_remove_cpt_slug( $post_link, $post, $leavename ) {

    if ( 'photograph' != $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', 'custom_remove_cpt_slug', 10, 3 );
После этого, вы получите ошибку 404. Это произойдет из-за того, что на данном этапе WordPress больше не определяет данную запись как запись отнесенную к определенному типу записи. Чтоб это исправить добавим небольшой фикс:
function custom_parse_request_tricksy( $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;
    }

    // 'name' will be set if post permalinks are just post_name, otherwise the page rule will match
    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'post', 'photograph', 'page' ) );
    }
}
add_action( 'pre_get_posts', 'custom_parse_request_tricksy' );

Стоит не забывать, что ярлыки записей должны быть уникальны и не совпадать с ярлыками типа записей.

Выше приведенный пример является вольным переводом статьи:
http://colorlabsproject.com/tutorials/remove-slugs-custom-post-type-url/
Блог WordPress плагины и хаки Убираем имя произвольного типа записи из URL