Как заставить работать single template для иерархической кастомной таксономии?

Ссылка скопирована
PHP
1 ответ

Здравствуйте!
Создал таксономию, создал кастомный тип поста. Связал это всё.
Собрал весь путь для древовидных таксономий. 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.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Дмитрий К. Ответ

Здесь проблема не в 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'
    );
});

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.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно