главная/Удаляем название кастомного пост тайпа из url. 2 способа
Remove custom post type slug

Удаляем название кастомного пост тайпа из 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. Если это так, перепишите с использованием именной функции.

И самое главной после всего этого, сбросьте пермалинки. Для этого зайдите в Настройки > Постоянные ссылки и нажмите кнопку Сохранить.