Как добиться правильного чпу?
Привет 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. Для создания нормальных урлов записей.
Вместо записей такого вида:
example.com/school/prezentatsiya-k-uroku-matematiki-3-klass/
Стало так:
example.com/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 класс и т.д.
Вопрос:
Как добиться правильного ЧПУ такого вида:
example.com/school/mathematics/presentations/1_klass/
example.com/school/russian/videolessons/3_klass/
P.S: Все это нужно для создания фильтра поиска по записям school.
Например пользователь заходит в рубрику предмета математика и сможет выбрать все презентации по математике для 3 класса.
Спасибо За ответы!