WordPress как на ладони
wordpress jino

Как добиться правильного чпу?

Привет Wp-kama! Помогите разобраться.
На сайте создан custom post type с именем school:

//Добавление произвольного типа записи/custom post type - school
add_action( 'init', 'true_register_school' ); // Использовать функцию только внутри хука init

function true_register_school() {
  $labels = array(
	'name' => 'Школа',
	'singular_name' => 'Материал', // админ панель Добавить->Функцию
	'add_new' => 'Добавить материал',
	'add_new_item' => 'Добавить новый материал', // заголовок тега <title>
	'edit_item' => 'Редактировать материал',
	'new_item' => 'Новый материал',
	'all_items' => 'Все материалы',
	'view_item' => 'Просмотр материалов на сайте',
	'search_items' => 'Искать материалы',
	'not_found' =>  'Материалов не найдено.',
	'not_found_in_trash' => 'В корзине нет материалов.',
	'menu_name' => 'Школа' // ссылка в меню в админке
  );
  $args = array(
	'labels' => $labels,
	'public' => true, // благодаря этому некоторые параметры можно пропустить
	'menu_icon' => 'dashicons-admin-users', // иконка корзины
	'menu_position' => 5,
	'has_archive' => true,
	'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', 'comments'),
	'taxonomies' => array('subjects', 'typedoc', 'klass')
  );
  register_post_type('school',$args);
}

Также у записей custom post type school убран slug. Для создания нормальных урлов записей.
Вместо записей такого вида:
site.ru/school/prezentatsiya-k-uroku-matematiki-3-klass/
Стало так:
site.ru/prezentatsiya-k-uroku-matematiki-3-klass/

/**
 * Remove the slug from published post permalinks. Only affect our custom post type, though.
 */
function gp_remove_cpt_slug( $post_link, $post, $leavename ) {

	if ( 'school' != $post->post_type || 'publish' != $post->post_status ) {
		return $post_link;
	}

	$post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link );

	return $post_link;
}
add_filter( 'post_type_link', 'gp_remove_cpt_slug', 10, 3 );

function gp_parse_request_trick( $query ) {

	// Only noop the main query
	if ( ! $query->is_main_query() )
		return;

	// Only noop our very specific rewrite rule match
	if ( 2 != count( $query->query ) || ! isset( $query->query['page'] ) ) {
		return;
	}

	// 'name' will be set if post permalinks are just post_name, otherwise the page rule will match
	if ( ! empty( $query->query['name'] ) ) {
		$query->set( 'post_type', array( 'post', 'page', 'school' ) );
	}
}
add_action( 'pre_get_posts', 'gp_parse_request_trick' );

К custom post type создано и привязано 3 taxonomy (subjects, typedoc, klass):

/// хук через который подключается функция
/// регистрирующая новые таксономии (create_subjects_taxonomies)
add_action( 'init', 'create_subjects_taxonomy', 0 );

// функция, создающая 1 новую таксономию "subjects" для постов типа "school"
function create_subjects_taxonomy(){

	// Добавляем древовидную таксономию 'subjects' (как категории)
	register_taxonomy('subjects', array('school'), array(
	 'hierarchical' => true,
	 'labels' => array(
			 // определяем заголовки для 'subjects'
			 'name' => 'Предметы',
			 'singular_name' => 'Предметы',
			 'search_items' =>  'Найти предметы',
			 'all_items' => 'Все предметы',
			 'parent_item' => null,
				//текст для родительского элемента таксономии. Этот аргумент не используется для не древовидных таксономий. По умолчанию null
			 'parent_item_colon' => null,
				//текст для родительского элемента таксономии, тоже что и parent_item но с двоеточием в конце. По умолчанию нет или
			 'edit_item' => 'Редактировать предмет',
			 'update_item' => 'Обновить предмет',
			 'add_new_item' => 'Добавить новый предмет',
			 'new_item_name' => 'Название нового предмета',
			 'menu_name' => 'Предметы'
	   ),
	   'public' => true, 
		/* каждый может использовать таксономию, либо
		только администраторы, по умолчанию - true */
	   'show_in_nav_menus' => true,
		/* добавить на страницу создания меню */
	 'show_ui' => true,
		/* добавить интерфейс создания и редактирования */
	   'show_tagcloud' => true,
		/* нужно ли разрешить облако тегов для этой таксономии */
	 'query_var' => true,
		/* разрешено ли использование query_var, также можно 
		указать строку, которая будет использоваться в качестве 
		него, по умолчанию - имя таксономии */
	 'rewrite' => array( 
		   /* настройки URL пермалинков */
		   'slug' => 'school', // ярлык
		   'hierarchical' => true // разрешить вложенность, если false - то не будет правильной иерархии категорий
			),
	));

}

/// хук через который подключается функция
/// регистрирующая новые таксономии (create_typedoc_taxonomies)
add_action( 'init', 'create_typedoc_taxonomy', 0 );

// функция, создающая 1 новую таксономию "typedoc" для постов типа "school"
function create_typedoc_taxonomy(){

	// Добавляем древовидную таксономию 'typedoc' (как категории)
	register_taxonomy('typedoc', array('school'), array(
	 'hierarchical' => true,
	 'labels' => array(
			 // определяем заголовки для 'typedoc'
			 'name' => 'Тип документа',
			 'singular_name' => 'Документы',
			 'search_items' =>  'Найти документы',
			 'all_items' => 'Все документы',
			 'parent_item' => null,
				//текст для родительского элемента таксономии. Этот аргумент не используется для не древовидных таксономий. По умолчанию null
			 'parent_item_colon' => null,
				//текст для родительского элемента таксономии, тоже что и parent_item но с двоеточием в конце. По умолчанию нет или
			 'edit_item' => 'Редактировать документ',
			 'update_item' => 'Обновить документ',
			 'add_new_item' => 'Добавить новый документ',
			 'new_item_name' => 'Название нового документа',
			 'menu_name' => 'Тип документа'
	   ),
	   'public' => true, 
		/* каждый может использовать таксономию, либо
		только администраторы, по умолчанию - true */
	   'show_in_nav_menus' => true,
		/* добавить на страницу создания меню */
	 'show_ui' => true,
		/* добавить интерфейс создания и редактирования */
	   'show_tagcloud' => true,
		/* нужно ли разрешить облако тегов для этой таксономии */
	 'query_var' => true,
		/* разрешено ли использование query_var, также можно 
		указать строку, которая будет использоваться в качестве 
		него, по умолчанию - имя таксономии */
	 'rewrite' => array( 
		   /* настройки URL пермалинков */
		   'slug' => 'school', // ярлык
		   'hierarchical' => true // разрешить вложенность, если false - то не будет правильной иерархии категорий
			),
	));

}

/// хук через который подключается функция
/// регистрирующая новые таксономии (create_klass_taxonomies)
add_action( 'init', 'create_klass_taxonomy', 0 );

// функция, создающая 1 новую таксономию "klass" для постов типа "school"
function create_klass_taxonomy(){

	// Добавляем древовидную таксономию 'klass' (как категории)
	register_taxonomy('klass', array('school'), array(
	 'hierarchical' => true,
	 'labels' => array(
			 // определяем заголовки для 'klass'
			 'name' => 'Класс',
			 'singular_name' => 'Классы',
			 'search_items' =>  'Найти классы',
			 'all_items' => 'Все классы',
			 'parent_item' => null,
				//текст для родительского элемента таксономии. Этот аргумент не используется для не древовидных таксономий. По умолчанию null
			 'parent_item_colon' => null,
				//текст для родительского элемента таксономии, тоже что и parent_item но с двоеточием в конце. По умолчанию нет или
			 'edit_item' => 'Редактировать класс',
			 'update_item' => 'Обновить класс',
			 'add_new_item' => 'Добавить новый класс',
			 'new_item_name' => 'Название нового класса',
			 'menu_name' => 'Класс'
	   ),
	   'public' => true, 
		/* каждый может использовать таксономию, либо
		только администраторы, по умолчанию - true */
	   'show_in_nav_menus' => true,
		/* добавить на страницу создания меню */
	 'show_ui' => true,
		/* добавить интерфейс создания и редактирования */
	   'show_tagcloud' => true,
		/* нужно ли разрешить облако тегов для этой таксономии */
	 'query_var' => true,
		/* разрешено ли использование query_var, также можно 
		указать строку, которая будет использоваться в качестве 
		него, по умолчанию - имя таксономии */
	 'rewrite' => array( 
		   /* настройки URL пермалинков */
		   'slug' => 'school', // ярлык
		   'hierarchical' => true // разрешить вложенность, если false - то не будет правильной иерархии категорий
			),
	));

}

Таксономия subjects для сортировки по предметам:
Математика, русский язык, физика, химия, биология, география, история и т.д.
Таксономия typedoc для сортировки по по типу файла:
Например: презентация, конспект, видеоурок и т.д.
Таксономия klass для сортировки по классам:
1 класс, 2 класс, 3 класс, 4 класс, 5 класс и т.д.

Вопрос:
Как добиться правильного ЧПУ такого вида:
site.ru/school/mathematics/presentations/1_klass/
site.ru/school/russian/videolessons/3_klass/

P.S: Все это нужно для создания фильтра поиска по записям school.
Например пользователь заходит в рубрику предмета математика и сможет выбрать все презентации по математике для 3 класса.
Спасибо За ответы!

0
Ferzet 6 месяцев назад

Нет ответов на этот вопрос.

На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.