get_template_part для каждого уровня таксономии

прежде чем мы начнем, спасибо за ваше время.

Structure: cpt = corsi tax = argomenti tax_term = parent tax_term_child = child tax_term_child_granchild = grandchild 

Текущий код (по таксономии-argomenti.php):

 $queried_object = get_queried_object(); $cpt = get_post_type( get_the_ID() ); $taxonomy = $queried_object->taxonomy; $term_id = $queried_object->term_id; $current_term = get_term_by('id', get_query_var('term'), $taxonomy); if((int)$current_term->parent) get_template_part('argomenti', 'child'); else get_template_part('argomenti', 'parent'); 

Я бы выбрал, какой шаблон использовать для всех уровней таксономии.

Пример:

 localhost\cpt archive-cpt.php localhost\cpt\parent argomenti-parent.php localhost\cpt\parent\child argomenti-child.php localhost\cpt\parent\child1\grandchild argomenti-grandchild.php 

Возможно с функцией, подобной той, которую я опубликовал?

Большое спасибо.

Solutions Collecting From Web of "get_template_part для каждого уровня таксономии"

Создание и включение шаблона для вашего настраиваемого архива типа записи просто, вам просто нужно создать archive-{$post_type}.php template, WordPress будет автоматически использовать этот шаблон при каждом посещении страницы архива определенного типа. Не забудьте установить параметр has_archive при регистрации типа вашего сообщения.

Что касается страницы архива таксономии, вы почти находитесь там, это всего лишь вопрос проверки того, является ли термин верхним уровнем, или ребенком или внуком. Что я могу прочитать из вашего вопроса, вы уже создали шаблон taxonomy-{$taxonomy}.php который вы будете использовать для всех терминов из таксономии argomenti , независимо от иерархии. Вы использовали части шаблона, которые вы будете включать в соответствии с иерархией.

Поэтому давайте рассмотрим логику, которую мы будем использовать здесь.

  • get_queried_object() будет удерживать термин объект текущего просматриваемого термина. Мы будем использовать это для получения родительского и терминологического термина

  • Все условия верхнего уровня будут иметь родительский идентификатор 0 , что важно.

  • Для любого термина с идентификатором parent больше 0 , нам нужно будет определить, где он вписывается в иерархию. Для этого мы будем использовать get_ancestors . Эта функция вернет массив идентификаторов термина. Идентификатор первого термина будет термином, который проверяется прямым родителем, а последний идентификатор термина будет состоять из термина верхнего уровня, родителя. Чтобы определить, где в иерархии входит термин, нам просто нужно получить размер массива, пустой массив – родительский, массив с одним ключевым средством – дочерний элемент, а массив с двумя ключами означает внук

Теперь мы можем поместить всю эту логику в код. Чтобы избежать кучи кода в шаблоне таксономии, мы создадим функцию, которую вы можете добавить в functions.php а затем вызовите одну строку в шаблон таксономии. ( ПРИМЕЧАНИЕ. Весь код не проверен и может быть ошибкой, поэтому обязательно проверяйте его локально при включенной отладке. Кроме того, вам потребуется PHP 5.4+)

 function get_tax_hierarchy_template_part( $template = '', $subfolder = '' ) { /** * Make sure we are actually on a taxonomy archive page, if not, return false * * Instead of returning false here, you can also set it to return a default template * Check the section commented out */ if ( !is_tax() ) return false; // return get_template_part( 'content' ); // Return default template // Get the current term object $current_term_object = get_queried_object(); // Check if we have a value for $subfolder, if so, sanitize it and add slashes if ( $subfolder ) $subfolder = '/' . filter_var( $subfolder, FILTER_SANITIZE_STRING ) . '/'; /** * Check if we have value for $template, if so, sanitize, if not, use the taxonomy name * Also append the $subfolder to $template */ if ( $template ) { $template = filter_var( $template, FILTER_SANITIZE_STRING ); } else { $template = $current_term_object->taxonomy; } $template = $subfolder . $template; // Check if current term is top level, if so, return template part for parent terms if ( $current_term_object->parent == 0 ) return get_template_part( $template, 'parent'); /** * If we have reached this section, it means our term is not toplevel * We must now determine where in the hierarchy the term is */ $hierarchy = get_ancestors( $current_term_object->term_id, $current_term_object->taxonomy ); // We must now get the size of the array $hierarchy_depth = count( $hierarchy ); /** * We will set child when the size of the array is one. For any size more * than one, we will set grandchild * * If you are going to have grand-grandchildren which should have its own * template, you would need to adjust this section */ $part = ( $hierarchy_depth == 1 ) ? 'child' : 'grandchild'; // Return the correct template part according to hierarchy return get_template_part( $template, $part ); } 

Теперь вы можете просто называть его следующим в шаблоне таксономии

 get_tax_hierarchy_template_part(); 

Если вы отступили назад, вы можете использовать его в любом месте

РЕДАКТИРОВАТЬ

В соответствии с запросом, я включил параметр в функцию, называемую $template . Теперь вы можете задать имя шаблона для части шаблона. Если этот параметр не установлен, будет использоваться имя таксономии.

ПРИМЕНЕНИЕ

Если ваша часть шаблона имеет следующее имя, {$taxonomy}-parent.php , вам нужно вызвать свою функцию следующим образом

 get_tax_hierarchy_template_part(); 

Если ваша часть шаблона называется чем-то другим, например content-parent.php , вам нужно вызвать вашу функцию следующим образом

 get_tax_hierarchy_template_part( 'content' ); 

EDIT 2

Из-за условий, при которых имя таксономии должно использоваться как значение по умолчанию для части шаблона, мне пришлось включить второй параметр $subfolder , чтобы разместить шаблонные части в подпапках. Я обновил код соответствующим образом.

ПРИМЕНЕНИЕ

В качестве второго параметра необходимо передать только имя подпапки без косых черт. Не забудьте передать пустую строку в качестве первого параметра, если вы используете {$taxonomy}-parent.php качестве шаблона

Пример:

 get_tax_hierarchy_template_part( '', 'subfoldername' ); 

Для content-parent.php типа content-parent.php используйте

  get_tax_hierarchy_template_part( 'content', 'subfoldername' );