Как получить элемент таксономии верхнего уровня для в котором находится указанная запись (пост)?

Есть таксономия tax, древовидная. Она прикреплена к постам (записям типа post).

Запись всегда прикрепляется к последнему уровню таксономии. Например, уровни такие: ягода > малина. Пост прикреплен к термину малина.

Вопрос:

Как получить самый родительский (самый верхний, самый первый) элемент таксономии (термин). Т.е. как получить термин ягода - термин верхнего уровня из указанной таксономии tax для текущего поста в цикле.

И желательно, чтобы я мог указать для какого поста мне нужно получить термин.

Заранее спасибо!

1
Гость
8.2 года назад
  • 0
    Kama 9796

    Родной функции в WordPress такой нет. Но это поправимо...

    /**
     * Получает термин верхнего уровня, для указанного или текущего поста в цикле
     * @param  string          $taxonomy      Название таксономии
     * @param  integer/object  [$post_id = 0] ID или объект поста
     * @return string/wp_error Объект термина или false
     */
    function get_top_term( $taxonomy, $post_id = 0 ) {
    	if( isset($post_id->ID) ) $post_id = $post_id->ID;
    	if( ! $post_id )          $post_id = get_the_ID();
    
    	$terms = get_the_terms( $post_id, $taxonomy );
    
    	if( ! $terms || is_wp_error($terms) ) return $terms;
    
    	// только первый
    	$term = array_shift( $terms );
    
    	// найдем ТОП
    	$parent_id = $term->parent;
    	while( $parent_id ){
    		$term = get_term_by( 'id', $parent_id, $term->taxonomy );
    		$parent_id = $term->parent;
    	}
    
    	return $term;
    }

    Пример того, как нужно использовать функцию:

    $top_term = get_top_term( 'category' );
    echo $top_term->name; // название термина
    
    /* Объект $top_term содержит такие данные
    WP_Term Object
    (
    	[term_id] => 562
    	[name] => Записи
    	[slug] => zapisi
    	[term_group] => 0
    	[term_taxonomy_id] => 582
    	[taxonomy] => tax
    	[description] => 
    	[parent] => 0
    	[count] => 1
    )
    */
    Леонэл 8.2 года назад

    Супер! Спасибо, то что нужно!

    Комментировать
  • 2
    Pruf 15

    Можно и по другому:

    global $post; 
    $post_ID = $post->ID; 
    $cat = get_the_category($post_ID); 
    $cat_id = $cat[0]->cat_ID; // id текущей категории
    
    $ancestors = get_ancestors( $cat_id, 'category' ); // получаем всех родителей
    $ancestors_reverse = array_reverse( $ancestors ); // изменяем порядок в массиве на обратный(от старшего к младшему)
    echo get_cat_name( $ancestors_reverse[0] ); // выводим название старшей категории. 

    Так можно получить категорию любого уровня вложенности начиная со старшей, например если нужно получить категорию вложенную в самого верхнего родителя, то:

    echo get_cat_name( $ancestors_reverse[1] );
    Kama 6.7 лет назад

    Тоже хорошее решение!

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