get_the_terms() — возвращает все элементы таксономий, присвоенные к указанному посту в виде массива их объектов

Благодаря этой функции вы можете вы вывести все метки, которые присвоены к посту, все рубрики, которым принадлежит пост (одновременно и метки и рубрики тоже можно), а также элементы других таксономий (иногда их называют — термины).

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

get_the_terms( $post, $taxonomy )
$post
(целое число|объект) Объект или ID нужного нам поста, термины которого нужно получить.
$taxonomy
(строка|массив) Название таксономии, элементы которой будем получать, также имеется возможность указать массив из нескольких таксономий, например array('category','post_tag').

В случае, если указанного вами поста не существует, либо ему просто не присвоено элементов заданных таксономий, функция возвращает false. А также объект WP_Error при указании несуществующей таксономии.

Выводимые термины сортируются по имени по возрастанию.

Примеры использования get_the_terms()

Как я уже писал, функция возвращает массив объектов таксономий, как с этим работать — посмотрим на примере.

Ну и как всегда начнём от простого к сложному.

1. Вывод ссылок на все метки текущего поста

// из условия понятно, что функция используется в цикле, а значит глобальная перменная $post->ID задана и содержит ID поста
$termini = get_the_terms( $post->ID, 'post_tag' );
 
// так как функция вернула массив, то логично будет прокрутить его через foreach()
foreach( $termini as $termin ){
	echo '<a href="' . get_term_link( $termin ) . '">' . $termin->name . '</a>';
}
/*
 * Также вы можете использовать:
 * $termin->ID - понятное дело, ID элемента
 * $termin->slug - ярлык элемента
 * $termin->term_group - значение term group
 * $termin->term_taxonomy_id - ID самой таксономии
 * $termin->taxonomy - название таксономии
 * $termin->description - описание элемента
 * $termin->parent - ID родительского элемента
 * $termin->count - количество содержащихся в нем постов
 */

Для получения URL ссылки на страницу термина, я использовал функцию get_term_link().

2. Вывод через запятую ссылок на термины, которые присвоены к посту

Основная проблема это, вы не поверите, запятые, то есть если мы будем просто выводить элементы как в первом примере и добавим запятую после </a>, то на конце будет всегда оставаться лишняя запятая, а она нам совсем ни к чему.

// переменная $post в данном случае - объект поста
$termini = get_the_terms( $post, array('category','post_tag','ваша_произвольная_таксономия') );
 
// проверяем, что $termini не равно false, и не является объектом WP_Error		
if ( $termini && ! is_wp_error( $termini ) ) {
 
	// все полученные элементы по ходу цикла мы будем класть в этот массив
	$termini_massiv = array();
 
	foreach ( $termini as $termin ) {
		// добавление элемента в массив
		$termini_massiv[] = '<a href="' . get_term_link( $termin ) . '" title="Перейти к ' . esc_attr( $termin->name ) .  '">' . $termin->name . '</a>';
	}
 
	// на данном этапе у нас имеется массив $termini_massiv, содержащий ссылки на все нужные термины	
	// используя функцию PHP join(), объединим элементы массива в строку, в качестве разделителя используем запятую с пробелом
	$termini_a_hrefs = join( ", ", $termini_massiv );
 
	// осталось только вывести блок ссылок
	echo '<div>Теги: <span>' . $termini_a_hrefs . '</span></div>';
}

Фильтры

У функции есть только один фильтр, который и совпадает с её названием — get_the_terms.

get_the_terms

Позволяет изменить список терминов, полученных в результате действия функции. Появился в версии WP 3.1.0

function get_the_terms_filter_cb( $terms, $post_id, $taxonomies) {
	/*
	 * $terms - результат функции, либо массив терминов, либо false, либо WP_Error
	 * $post_id - ID поста (именно ID, здесь уже объекта не может быть)
	 * $taxonomies - название таксономии, либо массив из нескольких названий
	 */
 
	// к примеру мы можем сделать так, чтобы для поста с определенным ID термины не выводились
	if( $post_id == 341 ) {
		return false;
	}
}
 
add_filter( 'get_the_terms', 'get_the_terms_filter_cb', 10, 3 );

Комментарии 4

  • Дима12 ноября 2015 в 17:11 #

    использую в цикле такую конструкцию:

    <?php $room_area = get_the_terms( $post->ID, 'area' ); ?>
    <li>Район: <b><?php echo $room_area->name ?></b></li>

    Но ничего не выводится, не подскажите в чем может быть проблема?

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...