Taxonomy: свой шаблон для дочек или родителей

На сайте создана taxonomy древовидная с rewrite slug: lessons. адрес такой:
example.com/lessons/ (lessons оформлена через кастомный шаблон page-lessons.php, в виде ссылок на рубрики).

В ней есть рубрики:
example.com/lessons/mathematics/
example.com/lessons/russian/
example.com/lessons/geography/
example.com/lessons/history/
example.com/lessons/english/

В этих рубриках есть тоже рубрики, пример:
example.com/lessons/mathematics/9/
example.com/lessons/russian/5/
example.com/lessons/geography/5/
example.com/lessons/history/2/
example.com/lessons/english/10/

Для /mathematics, /russian, /geography, /history, /english используется шаблон taxonomy-lessons.php (также он используется для дочек)

Как задать шаблон для дочек уровня /9, /5, /2, /10 и только. Их много.
Или как задать шаблон для родителей, тобишь для: /mathematics, /russian, /geography, /history, /english?
Спасибо!

1
Ferzet
8.6 лет назад 3
  • 1
    Kama 9790

    Сам шаблон нужно указать через фильтр template_include. В нем нужно проверять все вот это что вам нужно. Например для 9, 5, 6 и т.д. проверяем есть ли родитель и является ли родитель родителя lessons. Используй эти функции: cat_is_ancestor_of() is_category() get_ancestors() get_category()

    Примерно будет так: в шаблоне лежит файл lessons-sub2-tpl.php, который отвечает за вывод 3-го уровня рубрик (5 9 ...) и для второго уровня lessons-sub1-tpl.php:

    function sub_cat_template( $template ) {
    	$lessons_cat_id = 5;
    
    	// не рубрика
    	if( ! is_category() ) return $template;
    
    	$current_cat = get_queried_object();
    
    	// не дочерняя рубрика
    	if( ! $current_cat->parent  ) return $template;
    
    	// родственная рубрика главной рубрики lessons
    	if( cat_is_ancestor_of( $lessons_cat_id, $current_cat->term_id ) ){
    		// второй уровень
    		if( $current_cat->parent == $lessons_cat_id ){
    			if( $new_template = locate_template( array('lessons-sub1-tpl.php') ) )
    				$template =  $new_template ;
    		}
    		// третий уровень
    		else{
    			if( $new_template = locate_template( array('lessons-sub2-tpl.php') ) )
    				$template =  $new_template ;
    		}
    
    	}
    
    	return $template;
    }
    add_filter( 'template_include', 'sub_cat_template', 99 );

    Код не тестировал, возможны недочеты или мелкие ошибки, но общий принцип думаю понятен

    Ferzet 8.6 лет назад

    Благодаря этому примеру я придумал более изящнее решение, нужно чтобы код просто проверял, если это родитель то выводим такой то шаблон, если не родитель то выводим обычный. Помогите реализовать код, никак не могу додуматься как сделать, что не так, почему не работает:

    function portfolio_page_template( $template ) {
    
    	$current_cat = get_queried_object();
    
    	if( is_category ($current_cat->parent) ){
    		if ( $new_template = locate_template( array( 'portfolio-page-template.php' ) ) )
    			$template =  $new_template ;
    	}
    
    	return $template;
    }
    
    add_filter( 'template_include', 'portfolio_page_template', 99 );
    Kama 8.6 лет назад

    Вместо is_category ($current_cat->parent) просто $current_cat->parent

    Ferzet 8.6 лет назад
    function portfolio_page_template( $template ) {
    
    	$current_cat = get_queried_object();
    
    	if( $current_cat->parent ){
    		if ( $new_template = locate_template( array( 'portfolio-page-template.php' ) ) )
    			$template =  $new_template ;
    	}
    
    	return $template;
    }
    
    add_filter( 'template_include', 'portfolio_page_template', 99 );

    Тоже не хочет(

    Kama 8.6 лет назад

    Что-то ты не то делаешь! Я не поленился поставил вот этот код в functions.php и создал файл 'portfolio-page-template.php' в теме - все работает!

    единственное еще замечание - строку if( ! is_category() ) return $template; надо оставить... В остальном код работает, если у тебя не работает, то ищи проблему где-то еще...

    Вот такой код должен быть

    function portfolio_page_template( $template ) {
    	if( ! is_category() ) return $template;
    
    	$current_cat = get_queried_object();
    
    	if( $current_cat->parent ){
    		if ( $new_template = locate_template( array( 'portfolio-page-template.php' ) ) )
    			$template =  $new_template ;
    	}
    
    	return $template;
    }
    
    add_filter( 'template_include', 'portfolio_page_template', 99 );
    Ferzet 8.6 лет назад

    Да действительно, код работает! Спасибо!
    Только немного пришлось поменять if( ! is_category() ) return $template; на if( ! is_tax('name') ) return $template;
    Теперь для всех дочек, применяется шаблон portfolio-page-template.php
    Который раз Вы ,Kama, спасаете мой сайт) Спасибо Вам!

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