Как создать нужное мне ЧПУ кастомных постов WordPress?
пытаюсь получить URI в котором буду тотображаться все вложенные категории поста. Пост download Таксономия download_cat Например если я создам категории news -> football -> matches (где matches дочерняя категория football, а football дочерняя категория news) И попробую перейти на страницу matches то по дефолту получу сделающий адрес example.com/download_cat/matches
но не
example.com/download_cat/news/football/matches
Мой код:
Регистрация поста
register_post_type('download', array( 'label' => null, 'labels' => array( 'name' => 'Документация', // основное название для типа записи 'singular_name' => 'Документация', // название для одной записи этого типа 'add_new' => 'Добавить документ', // для добавления новой записи 'add_new_item' => 'Добавление документа', // заголовка у вновь создаваемой записи в админ-панели. 'edit_item' => 'Редактирование документа', // для редактирования типа записи 'new_item' => 'Новый документ', // текст новой записи 'view_item' => 'Смотреть документ', // для просмотра записи этого типа. 'search_items' => 'Искать документ', // для поиска по этим типам записи 'not_found' => 'Не найдено', // если в результате поиска ничего не было найдено 'not_found_in_trash' => 'Не найдено в корзине', // если не было найдено в корзине 'parent_item_colon' => '', // для родителей (у древовидных типов) 'menu_name' => 'Документация', // название меню ), 'description' => '', 'menu_position' => 6, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_rest' => false, 'rest_base' => '', 'show_in_menu' => true, 'exclude_from_search' => false, 'capability_type' => 'post', 'map_meta_cap' => true, 'hierarchical' => false, 'rewrite' => array( 'slug'=>'download/%download_cat%', 'with_front'=>false, 'pages'=>false, 'feeds'=>false, 'feed'=>false ), 'has_archive' => 'downloads', 'query_var' => true, 'supports' => array( 'title' ), 'taxonomies' => array( 'download_cat' ), ) );
Регистрация таксономии:
register_taxonomy('download_cat', array('download'), array( 'label' => '', // определяется параметром $labels->name 'labels' => array( 'name' => 'Категории', 'singular_name' => 'Категория', 'search_items' => 'Поиск категории', 'all_items' => 'Все категории', 'view_item ' => 'Просмотр категории', 'parent_item' => 'Родительская категория', 'parent_item_colon' => 'Родительская категория:', 'edit_item' => 'Редиктировать категорию', 'update_item' => 'Обновит ькатегорию', 'add_new_item' => 'Добавить новую категорию', 'new_item_name' => 'Добавить новую категорию', 'menu_name' => 'Категории', ), 'description' => '', // описание таксономии 'public' => true, 'show_in_nav_menus' => false, // равен аргументу public 'show_ui' => true, // равен аргументу public 'show_tagcloud' => false, // равен аргументу show_ui 'hierarchical' => true, 'rewrite' => array('slug'=>'download', 'hierarchical'=>false, 'with_front'=>false, 'feed'=>false ), 'show_admin_column' => true, // Позволить или нет авто-создание колонки таксономии в таблице ассоциированного типа записи. (с версии 3.5) ) );
И хук для формирования чпу:
add_filter('post_type_link', 'download_rout', 1, 2); function download_rout( $permalink, $post ){ // выходим если это не наш тип записи: без холдера %products% if( strpos($permalink, '%download_cat%') === false ) return $permalink; // Получаем элементы таксы $terms = get_the_terms($post, 'download_cat'); // если есть элемент заменим холдер if( ! is_wp_error($terms) && !empty($terms) && is_object($terms[0]) ) { //$term_slug = array_pop($terms)->slug; //$term_slug = $terms[0]->slug; $term_slug = get_term_parents_list( $terms[0]->term_id, 'download_cat', array( 'separator' => '/', 'format' => 'slug', 'link' => false, 'inclusive' => true, ) ); $term_slug = trim($term_slug, '/'); } // элемента нет, а должен быть... else $term_slug = 'no-categories'; return str_replace('%download_cat%', $term_slug, $permalink );
Таким кодом получается заставить формировать uri нужным образом но если мы создадим любой пост для дочерней категории то получим 404
.
Например если я создам пост test для категории matches, то на странцие редактирования поста сформируется нужный мне uri а именно
example.com/download/news/football/matches/test
но если я перейду по этому адресу то получу 404
.
То же самое произойдет если я попытаюсь перейти например по адресу example.com/download/news/football
или example.com/download/news/football/matches/
, но если я запрошу адрес example.com/download/news
, то отработает категория news и выведет все посты. Или же если наберу адрес example.com/download/matches/test
то выведется запись test
.
Я так понимаю что просто с помощью этого хука нарезать адреса мало, нужно наверное их как-то регистрировать? Подскажите пожалуйста в чем проблема.
По себе скажу что задача сложная, стандартными способами вордпресс не реализовать и проверить эту часть:
'rewrite' => array('slug'=>'download', 'hierarchical'=>false,
может 'hierarchical'=>true ?
.................
Далее, внимательно изучать и читать статью https://wp-kama.ru/id_7637/chpu-dlya-treh-taksonomij-i-tipa-zapisi-odnovremenno.html
тк в ней совсем другой подход, слджнее но гибче, но верняка есть свои подводные камни, к примеру при настройке крошек... формировании ссылок на категории... опчем тема кастомного чпу в вп достаточно плотная, и слабо освещена, в поиске выходят самые простые примеры... с минимальными вложенностями.
Еще есть хорошие слайды по теме тут: https://es.slideshare.net/MikeSchinkel/hardcore-url-routing-2014
Еще может осложнит задачу это пагинация с учетом всех этих выкрутасов...
Спасибо за помощь