WordPress как на ладони
rgbcode is looking for WordPress developers.

get_the_terms()WP 2.5.0

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

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

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

Функция получит только те термины (элементы таксономии), которые галочками отмечены на странице редактирования записи.

Т.е. в таком случае функция получит только отмеченные термины.

Работает на основе: wp_get_object_terms()
1 раз — 0.005139 сек (очень медленно) | 50000 раз — 1.66 сек (быстро) | PHP 7.1.2, WP 4.8
Хуки из функции

Возвращает

WP_Term[]|false|WP_Error.

  • Массив объектов WP_Term (терминов).
  • false, если элементы не найдены или указанной записи не существует.
  • WP_Error в остальных случаях.
Array (
	[0] => WP_Term Object (
		[term_id] => 30
		[name] => Разное
		[slug] => other
		[term_group] => 0
		[term_taxonomy_id] => 30
		[taxonomy] => category
		[description] =>
		[parent] => 3
		[count] => 21
		[filter] => raw
		[term_order] => 7
	)

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

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

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

Примеры

1

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

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

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

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

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

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

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

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

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

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

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

/**
 * Получает термин верхнего уровня, для указанного или текущего поста в цикле.
 *
 * @param  string      $taxonomy  Название таксономии
 * @param  int/object  $post_id   ID или объект поста
 *
 * @return string/wp_error Объект термина или false
 */
function get_top_term( $taxonomy, $post_id = 0 ){

	isset( $post_id->ID ) && $post_id = $post_id->ID;
	! $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;

Список изменений

С версии 2.5.0 Введена.

Код get_the_terms() WP 6.4.3

function get_the_terms( $post, $taxonomy ) {
	$post = get_post( $post );

	if ( ! $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 WP_Term[]|WP_Error $terms    Array 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;
}
20 комментариев
    Войти