Удаление названия типа записи (префикса) из URL

Вариант 1

Допустим у нас есть новый тип записи team, который имеет ЧПУ вида: example.com/team/nazvanie-zapisi. Мы хотим удалить префикс team и сделать ссылки этого типа записи такого вида: example.com/nazvanie-zapisi.

add_filter( 'post_type_link', 'remove_post_type_slug', 10, 2 );
add_action( 'pre_get_posts', 'add_post_type_to_get_posts_request' );

// Удаляем префикс с именем типа записи из URL
function remove_post_type_slug( $post_link, $post ){

	if( $post->post_type === 'team' ){
		return str_replace( "/$post->post_type/", '/', $post_link );
	}

	return $post_link;
}

// Добавляем тип записи в запрос
function add_post_type_to_get_posts_request( $query ){

	if( is_admin() || ! $query->is_main_query() )
		return; // не основной запрос

	// не запрос с name параметром (как у постоянной страницы)
	if( ! isset($query->query['page']) || empty($query->query['name']) || count($query->query) != 2 )
		return;

	$query->set('post_type', array('post', 'page', 'team') ); // 'team' added
}

Тут надо иметь ввиду, что наш новый URL вида example.com/nazvanie-zapisi по структуре точно такой же как URL постоянных страниц (и возможно как ЧПУ постов). И если название постоянной страницы и записи нового типа будут совпадать, то мы получим конфликт и вероятно будет показана неправильная запись. Но так как такая ситуация очень мало вероятна, мы этот возможный баг просто имеем ввиду и никак не обрабатываем...

Вариант 2

В этом варианте тип записи называется pool_services и тут мы не используем хук post_type_link, а используем метод add_permastruct() - это позволяет убрать название типа записи из URL не только на фронте, но и в админке.

В результате получим URL вида /postname а не /pool-services/postname.

add_action( 'init', 'pw24_post_type_rewrite' );
add_action( 'pre_get_posts', 'pw24_add_post_type_to_get_posts_request' );

function pw24_post_type_rewrite() {
	global $wp_rewrite;

	// в данном случае тип записи - pool_services
	$wp_rewrite->add_rewrite_tag( "%pool_services%", '([^/]+)', "pool_services=" );
	$wp_rewrite->add_permastruct( 'pool_services', '%pool_services%' );
}

function pw24_add_post_type_to_get_posts_request( $query ){

	if( is_admin() || ! $query->is_main_query() )
		return; // не основной запрос

	// не запрос с name параметром (как у постоянной страницы)
	if( ! isset($query->query['page']) || empty($query->query['name']) || count($query->query) != 2 )
		return;

	// добавляем 'pool_services'
	$query->set( 'post_type', [ 'post', 'page', 'pool_services' ] );
}

Теперь в ссылках (на сайте и в админке) отсутствует название типа записи 'pool-services' и все страницы работают как надо.

Эта заметка встроена в: WP_Rewrite{}