Как удалить префикс (slug) из URL у произвольных типов записей
При создании произвольного типа записей, в WordPress автоматически добавляется префикс с его именем в URL, например www.site.ru/prefix/zapis/. Изменить его можно в параметре rewrite. А вот чтобы полностью удалить, можно воспользоваться приведенным в этой статье хаком.
Для начала удаляем параметр rewrite, а лучше устанавливаем его в false в функции создания кастомного типа записи register_post_type(), обычно она находится в файле functions.php вашей темы.
Затем в этом же файле добавляем несколько функций:
function it-blog_post_type_rewrite() {
global $wp_rewrite;
// изменить portfolio на ваш тип записи
$wp_rewrite->add_rewrite_tag("%portfolio%", '([^/]+)', "portfolio=");
$wp_rewrite->add_permastruct('portfolio', '%portfolio%' );
}
add_action( 'init', 'it-blog_post_type_rewrite');
function it-blog_rewrite_conflicts( $request ) {
if(!is_admin())
$request['post_type'] = array('portfolio', 'post', 'page'); // вместо portfolio ваш тип записи
return $request;
}
add_filter( 'request', 'it-blog_rewrite_conflicts' );
Теперь идем в Настройки → Постоянные ссылки, выбираем Название записи.

Можно попробовать оставить настройки как и были и просто пересохранить. Но были случаи, что без выбора Название записи хак не работал.
В моем случае все заработало, кроме главной страницы, она перестала отображаться. При чем проверки функциями WP is_front_page() и is_home() не срабатывали. Пришлось дописать проверку так $_SERVER['REQUEST_URI'] != '/' В итоге получился следующий код:
function it-blog_rewrite_conflicts( $request ) {
if(!is_admin() && $_SERVER['REQUEST_URI'] != '/')
$request['post_type'] = array('portfolio', 'post', 'page'); // вместо portfolio ваш тип записи
return $request;
}
add_filter( 'request', 'it-blog_rewrite_conflicts' );