WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

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

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

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

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

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

0
Ferzet
27 апреля 2016
  • 0
    Kama7729

    Сам шаблон нужно указать через фильтр 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 2 Май. 2016

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

    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 2 Май. 2016

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

    Ferzet 2 Май. 2016
    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 2 Май. 2016

    Что-то ты не то делаешь! Я не поленился поставил вот этот код в 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 2 Май. 2016

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

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