Удаляем название кастомного пост тайпа из url. 2 способа
Допустим у нас есть custom post type под названием cars. В результате создания поста со слагом dodge мы получим такой линк: mysite.com/cars/dodge. Нам требуется удалить часть url с cars и по итогу получить mysite.com/dodge.
Для начала нам нужно переписать permalinks.
Хукаемся на post_type_link и вырезаем первую часть.
add_filter( 'post_type_link', 'zl_remove_slug', 10, 2 );
function zl_remove_slug( $post_link, $post ) {
global $post;
if ( 'cars' !== $post->post_type || 'publish' !== $post->post_status ) {
return $post_link;
}
$post_link = home_url( $post->post_name ) . '/';
$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
return $post_link;
}
Теперь нам нужно заставить работать нашу ссылку без названия пост тайпа в начале.
Внимание, тут есть два варианта. Первый если у вас структура ссылок в настройках WordPress не произвольная. И второй если произвольная например: /%category%/%postname%/
Первый вариант с использованием pre_get_posts
function zl_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', 'cars', 'page' ) );
}
}
add_action( 'pre_get_posts', 'zl_parse_request' );
Второй вариант для произвольной структуры ссылок
Используем rewrite rule
add_action('init', function(){
add_rewrite_rule( '(.+?)/?$', 'index.php?cars=$matches[1]', 'bottom' );
});
Обратите внимание, что тут используется анонимная функция. Убедитесь что у вас не устаревшая версия PHP. Если это так, перепишите с использованием именной функции.
И самое главной после всего этого, сбросьте пермалинки. Для этого зайдите в Настройки > Постоянные ссылки и нажмите кнопку Сохранить.