WordPress как на ладони
wordpress jino

get_the_terms() WP 2.5.0

Получает элементы таксономии (термины), которые относятся к указанному посту (записи).

Эта функция может быть использована внутри Цикла WordPress. Или ей нужно передать ID поста, элементы таксономии которого нужно получить.

Функция полностью идентична wp_get_object_terms( $id, $taxonomy ). Разница в том, что в get_the_terms() работает кэшем и есть фильтр 'get_the_terms'.

Используется в: get_the_tags(), get_the_category(), get_the_term_list().
Работает на основе: wp_get_object_terms()
✈ 1 раз = 0.005139с = очень медленно | 50000 раз = 1.66с = быстро PHP 7.1.2, WP 4.8
Хуки из функции:
Возвращает

Массив/false/WP_Error.

  • Массив объектов с данными об элементах таксономии к которым относится запись (пост).
  • false, если элементы не найдены или указанной записи не существует.
  • WP_Error в остальных случаях.
Array
(
	[0] => stdClass Object
		(
			[term_id] => 21
			[name] => Замены плагинам
			[slug] => zamenyi-plaginam
			[term_group] => 0
			[term_taxonomy_id] => 21
			[taxonomy] => post_tag
			[description] => 
			[parent] => 0
			[count] => 8
			[filter] => raw
		)

	[1] => stdClass Object
		(
		...
		)
	...
)

Использование

get_the_terms( $id, $taxonomy );
$id(число/WP_Post) (обязательный)
ID или объект поста/записи, связанные элементы таксономии (термины) которого нужно получить.
$taxonomy(строка) (обязательный)
Название таксономии, термины которой для записи нужно получить.

Примеры

#1. Выведем ссылки на элементы таксономии 'my_tax', относящиеся к посту 10

$cur_terms = get_the_terms( 10, 'my_tax' );
foreach( $cur_terms as $cur_term ){
	echo '<a href="'. get_term_link( (int)$cur_term->term_id, $cur_term->taxonomy ) .'">'. $cur_term->name .'</a>,';
}

Тоже самое можно сделать внутри Цикла WordPress:

Для каждого поста будут выведены связанные термины (как метки). Для этого укажем ID поста динамически:

$cur_terms = get_the_terms( $post->ID, 'my_tax' );
foreach( $cur_terms as $cur_term ){
	echo '<a href="'. get_term_link( (int)$cur_term->term_id, $cur_term->taxonomy ) .'">'. $cur_term->name .'</a>,';
}

#2. Получим только первый термин

Допустим, мы получает термины записи, но их там не может быть больше одного. Т.е. нам нужно получить данные только одного элемента таксономии, к которой принадлежит запись. Но эта функция возвращает массив объектов терминов, а нам нужен только первый...

$terms = get_the_terms( $post->ID, 'my_tax' );
if( $terms ){
	$term = array_shift( $terms );

	// теперь можно можно вывести название термина
	echo $term->name;
}

#3. Получает термин верхнего уровня, для указанного или текущего поста в цикле

Это отдельная функция на базе get_the_terms()

/**
 * Получает термин верхнего уровня, для указанного или текущего поста в цикле
 * @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;

Код get the terms: wp-includes/category-template.php WP 4.9

<?php
function get_the_terms( $post, $taxonomy ) {
	if ( ! $post = get_post( $post ) )
		return false;

	$terms = get_object_term_cache( $post->ID, $taxonomy );
	if ( false === $terms ) {
		$terms = wp_get_object_terms( $post->ID, $taxonomy );
		if ( ! is_wp_error( $terms ) ) {
			$term_ids = wp_list_pluck( $terms, 'term_id' );
			wp_cache_add( $post->ID, $term_ids, $taxonomy . '_relationships' );
		}
	}

	/**
	 * Filters the list of terms attached to the given post.
	 *
	 * @since 3.1.0
	 *
	 * @param array|WP_Error $terms    List of attached terms, or WP_Error on failure.
	 * @param int            $post_id  Post ID.
	 * @param string         $taxonomy Name of the taxonomy.
	 */
	$terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy );

	if ( empty( $terms ) )
		return false;

	return $terms;
}

Cвязанные функции

Из метки: term (термины таксономий)

Еще из раздела: Для записей

get_the_terms 7 комментариев
  • Geleosan cайт: life-trip.ru

    Подскажите, пожалуйста, а из массива $cur_terms можно как-то вытащить данные без цикла foreach?

    В примерах в посте сначала перебирается $cur_terms как $cur_term, а потом вытаскивается $cur_term->name. Конструкция $cur_terms[0]->name не работает...

    Ответить3 года назад #
    • Kama4659

      Конструкция $cur_terms[0]->name не работает...

      У вас на сервере старая версия PHP, вообще такая конструкция работает.

      Можно еще так вытаскивать первый элемент массива, если индекс не известен:

      echo array_shift( $cur_terms )->name; // выведет "название рубрики"
      Ответить3 года назад #
      • Geleosan cайт: life-trip.ru

        Спасибо, за ответ. Вообще у меня 5.4, то есть не старая...Или 5.5 для этого надо?

        array_shift работает!

        Ответить3 года назад #
  • Дмитрий

    Спасибо Kama! А можно каким-то образом исключить из цикла foreach термины верхнего уровня используя ID. У меня в таксономии иерархическая структура терминов.

    P.S. Такую возможность имеет функция get_terms(): $args = array( 'exclude' => array (28, 29, 30, 31) );, но она просто получает термины указанной таксономии. Мне же нужно получить термины, которые относятся к указанному посту и при этом исключить вывод терминов верхнего уровня.

    Буду признателен за любую наводящую информацию.

    Ответить1.1 года назад #
    • Kama4659

      Через хук можно это сделать...

      //$terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy );
      add_filter('get_the_terms', 'exclude_top_level_cats', 10, 3);
      function exclude_top_level_cats( $terms, $post_id, $taxonomy ){
      	// ничего не делаем если этого не наша такса
      	if( $taxonomy !== 'category' )
      		return $terms;
      
      	// удалим лишние термины
      	$exclude = array(28, 29, 30, 31); // ID терминов, которые нужно удалить
      	foreach( $terms as $kk => $term ){
      		if( in_array($term->term_id, $exclude) )
      			unset($terms[ $kk ]);
      	}
      
      	return $terms;
      }
      Ответить1.1 года назад #
      • Дмитрий

        Супер! Спасибо! Почему бы тебе (извини, что на ты) не добавить на сайт блок для перевода N суммы на развитие и поддержание проекта. У меня (думаю найдутся единомышленники) возникает желание отблагодарить таких авторов за качественные проекты и поддержку.

        P.S. Еще раз спасибо! thank_you

        1
        Ответить1.1 года назад #
  • Андрей

    А какой из способов получения термов таксономии поста является самым быстрым?

Здравствуйте, !

Ваш комментарий