Как удалить префикс (slug) из URL у произвольных типов записей

globe-internet-icon-line-connection-of-circuit-board

При создании произвольного типа записей, в 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' );

Теперь идем в Настройки → Постоянные ссылки, выбираем Название записи.

rewrite1-9139065

Можно попробовать оставить настройки как и были и просто пересохранить. Но были случаи, что без выбора Название записи хак не работал.

В моем случае все заработало, кроме главной страницы, она перестала отображаться. При чем проверки функциями 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' );

Читайте также: