Как заставить работать single template для иерархической кастомной таксономии?
Здравствуйте!
Создал таксономию, создал кастомный тип поста. Связал это всё.
Собрал весь путь для древовидных таксономий. URL в админке по итогу формируется правильный.
spoiler
add_filter('post_type_link', 'katalog_permalink', 10, 2); function katalog_permalink( $permalink, $post ){ // выходим если это не наш тип записи if( strpos($permalink, '%katalogcat%') === false ) return $permalink; // Получаем элементы таксы $terms = get_the_terms($post, 'katalogcat'); // если есть элемент заменим холдер if( ! is_wp_error($terms) && !empty($terms) ) { $term_id = $terms[0]->term_id; $term_slug = get_term_parents_list( $term_id, 'katalogcat', array( 'separator' => '/', 'format' => 'slug', 'link' => false, 'inclusive' => true, ) ); $term_slug = substr($term_slug, 0, -1); } // элемента нет, а должен быть... else $term_slug = 'no-category'; return str_replace('%katalogcat%', $term_slug, $permalink ); } |
add_filter('post_type_link', 'katalog_permalink', 10, 2); function katalog_permalink( $permalink, $post ){ // выходим если это не наш тип записи if( strpos($permalink, '%katalogcat%') === false ) return $permalink; // Получаем элементы таксы $terms = get_the_terms($post, 'katalogcat'); // если есть элемент заменим холдер if( ! is_wp_error($terms) && !empty($terms) ) { $term_id = $terms[0]->term_id; $term_slug = get_term_parents_list( $term_id, 'katalogcat', array( 'separator' => '/', 'format' => 'slug', 'link' => false, 'inclusive' => true, ) ); $term_slug = substr($term_slug, 0, -1); } // элемента нет, а должен быть... else $term_slug = 'no-category'; return str_replace('%katalogcat%', $term_slug, $permalink ); }
По итогу категории и подкатегории открываются нормально: site/katalog/category/subcategory/.
При создании поста ссылка отображается правильно site/katalog/category/subcategory/post-link.
Но отдаёт код 404.
Я даже назначил конкретный шаблон для этих постов:
spoiler
function wp_kama_template_include_filter( $template ) { $terms = get_the_terms($post, 'katalogcat'); $term_id = $terms[0]->term_id; $parent_page_id = $term_id; $post = get_queried_object(); if( is_page( $parent_page_id ) || $parent_page_id === $post->post_parent ){ return get_theme_file_path( '/single-katalog.php' ); } return $template; } |
function wp_kama_template_include_filter( $template ) { $terms = get_the_terms($post, 'katalogcat'); $term_id = $terms[0]->term_id; $parent_page_id = $term_id; $post = get_queried_object(); if( is_page( $parent_page_id ) || $parent_page_id === $post->post_parent ){ return get_theme_file_path( '/single-katalog.php' ); } return $template; }
Ссылка правильная, конкретно этот шаблон подгружается. Но сама запись отдаёт код 404 и сам контент записи в шаблоне страницы соответственно не отображается.
Куда копать дальше?
Дополнительно
Тут не в шаблонах дело, а в rewrite_rules. Проверьте какой из них WP использует по данному пути. Вангую, что будет искать термин таксономии со слагом post-link.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Здесь проблема не в
single-katalog.php. Если URL записи отдает 404, WordPress не смог разобрать адрес в основной query. Подключение шаблона черезtemplate_includeне исправит это: шаблон может загрузиться, но запрос уже считается 404, поэтому нормального объекта записи внутри него нет. Нужно проверять и чинить rewrite rules.Когда вы меняете permalink через
post_type_linkи вставляете путь таксономии в URL, WordPress должен иметь правило, которое обратным ходом разберет такой адрес в конкретную запись. Пример направления:add_action('init', function () { add_rewrite_rule( '^katalog/(.+?)/([^/]+)/?$', 'index.php?post_type=katalog&name=$matches[2]', 'top' ); });
После добавления или изменения rewrite нужно один раз сбросить правила: в админке открыть «Настройки → Постоянные ссылки» и нажать «Сохранить». На проде не делайте
flush_rewrite_rules()на каждом запросе — это тяжелая операция.Также проверьте регистрацию CPT: у него должны быть
'public' => true,'query_var' => true, корректныйrewriteи уникальный slug. Для архива терминов используетсяtaxonomy-katalogcat.php, а для одиночной записи CPT —single-katalog.php. Если есть одинаковые slug у термина и записи, или правило таксономии стоит раньше правила записи, WordPress может принимать адрес записи за архив термина. Диагностика: выведите rewrite rules или используйте плагин Query Monitor и посмотрите, какое правило срабатывает для проблемного URL.