Добавить таксономию (свой тип записи) WordPress

//Таксономия Услуга
add_action( 'init', 'register_services_post_type' );
function register_services_post_type() {
	register_taxonomy('servicescat', array('services'), array(
		'label'                 => 'Рубрика услуг', // определяется параметром $labels->name
		'labels'                => array(
			'name'              => 'Рубрики услуг',
			'singular_name'     => 'Рубрика услуг',
		),
		'public'                => true,
		'show_in_nav_menus'     => false, // равен аргументу public
		'show_ui'               => true, // равен аргументу public
		'show_tagcloud'         => false, // равен аргументу show_ui
		'hierarchical'          => true,
		'rewrite'               => array('slug'=>'services', 'hierarchical'=>false, 'with_front'=>false, 'feed'=>false ),
		'show_admin_column'     => true, // Позволить или нет авто-создание колонки таксономии в таблице ассоциированного типа записи. (с версии 3.5)
		'show_in_rest'=> true,
	) );

	register_post_type('services', array(
		'label'               => 'Услуга',
		'labels'              => array(
			'name'          => 'Услуга',
			'singular_name' => 'Услуга',
			'menu_name'     => 'Услуги',
			'all_items'     => 'Все услуги',
			'add_new'       => 'Добавить услугу',
			'add_new_item'  => 'Добавить новую услугу',
			'edit'          => 'Редактировать',
			'edit_item'     => 'Редактировать услугу',
			'new_item'      => 'Новая услуга',
		),
		'menu_position'       => 4,
		'description'         => '',
		'public'              => true,
		'publicly_queryable'  => true,
		'show_ui'             => true,
		'show_in_rest'        => true,
		'rest_base'           => '',
		'show_in_menu'        => true,
		'exclude_from_search' => false,
		'capability_type'     => 'post',
		'map_meta_cap'        => true,
		'hierarchical'        => false,
		'rewrite'             => array( 'slug'=>'services/%servicescat%', 'with_front'=>false, 'pages'=>false, 'feeds'=>false, 'feed'=>false ),
		'has_archive'         => 'services',
		'query_var'           => true,
		'supports'            => array( 'title', 'editor', 'thumbnail' ),
		'taxonomies'          => array( 'servicescat' ),
	) );
}

add_filter('post_type_link', 'services_permalink', 1, 2);
function services_permalink( $permalink, $post ){
	if( strpos($permalink, '%servicescat%') === false )
		return $permalink;
	$terms = get_the_terms($post, 'servicescat');
	if( ! is_wp_error($terms) && !empty($terms) && is_object($terms[0]) )
		$term_slug = array_pop($terms)->slug;
	else
		$term_slug = 'no-servicescat';
	return str_replace('%servicescat%', $term_slug, $permalink );
}
//Таксономия Услуга

Удалить slag из url

//убрать слаг из таксономий
function sh_remove_cpt_slug( $post_link, $post, $leavename ) {
    if ( in_array( $post->post_type, array( 'news' ) )
        || in_array( $post->post_type, array( 'post' ) )
        || in_array( $post->post_type, array( 'services' ) )
        || in_array( $post->post_type, array( 'area' ) )
        || in_array( $post->post_type, array( 'metro' ) )
        || 'publish' == $post->post_status )
        $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );
        return $post_link;
}
add_filter( 'post_type_link', 'sh_remove_cpt_slug', 10, 3 );
function sh_parse_request( $query ) {
    if ( ! $query->is_main_query() ) {
        return;
    }
    if ( 2 != count( $query->query )
        || ! isset( $query->query['page'] ) )
        return;
    if ( ! empty( $query->query['name'] ) ) {
        $query->set( 'post_type', array( 'news','post','services','area','metro' ) );
    }
}
add_action( 'pre_get_posts', 'sh_parse_request' );
//убрать слаг из таксономий

Убрать слаг способ 2

//убрать слаг
// смена запроса
add_filter('request', 'true_smenit_request', 1, 1 );
 
function true_smenit_request( $query ){
 
	$taxonomia_name = 'devices'; // укажите название таксономии здесь, это также могут быть рубрики category или метки post_tag
 
	// запросы для дочерних элементов будут отличаться, поэтому нам потребуется дополнительная проверка
	if( $query['attachment'] ) :
		$dochernia = true; // эту переменную задаём для себя, она нам потребуется дальше
		$urlyarlyk = $query['attachment']; // это ярлык данного термина/рубрики/метки
	else:
		$dochernia = false;
		$urlyarlyk = $query['name']; // как видите, здесь ярлык хранится в другой переменной запроса
	endif;
 
 
	$termin = get_term_by('slug', $urlyarlyk, $taxonomia_name); // получаем элемент таксономии по ярлыку
 
	if ( isset( $urlyarlyk ) && $termin && !is_wp_error( $termin )): // если такого элемента не существует, прекращаем выполнение кода
 
		// для страниц дочерних элементов код немного отличается
		if( $dochernia ) {
			unset( $query['attachment'] );
			$parent = $termin->parent;
			while( $parent ) {
				$parent_term = get_term( $parent, $taxonomia_name);
				$urlyarlyk = $parent_term->slug . '/' . $urlyarlyk; // нам нужно получить полный путь, состоящий из ярлыка текущего элемента и всех его родителей
				$parent = $parent_term->parent;
			}
		} else {
			unset($query['name']);
		}
 
		switch( $taxonomia_name ): // параметры запроса для рубрик и меток отличаются от других таксономий
			case 'category':{
				$query['category_name'] = $urlyarlyk;
				break;
			}
			case 'post_tag':{
				$query['tag'] = $urlyarlyk;
				break;
			}
			default:{
				$query[$taxonomia_name] = $urlyarlyk;
				break;
			}
		endswitch;
 
	endif;
 
	return $query;
 
}
 
// смена самой ссылки
add_filter( 'term_link', 'true_smena_permalink', 10, 3 );
 
function true_smena_permalink( $url, $term, $taxonomy ){
 
	$taxonomia_name = 'devices'; // название таксономии, тут всё понятно
	$taxonomia_slug = 'devices'; // ярлык таксономии - зависит от параметра rewrite, указанного при создании и может отличаться от названия,
	// как например таксономия меток это post_tag, а ярлык по умолчанию tag
 
	// выходим из функции, если указанного ярлыка таксономии нет в URL или если название таксономии не соответствует
	if ( strpos($url, $taxonomia_slug) === FALSE || $taxonomy != $taxonomia_name ) return $url;
 
	$url = str_replace('/' . $taxonomia_slug, '', $url); // если мы ещё тут, выполняем замену в URL
 
	return $url;
}
//убрать слаг
Контакты

Работаем: с ПН по ПТ, с 08:00 до 17:00 (МСК)
Отдыхаем: в СБ и ВС, чтобы быть в тонусе
и реализовывать самые сложные идеи