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

get_term_by() WP 2.3.0

Получает указанный элемент таксономии (термин). Данные можно получить, указав: имя, ярлык или ID элемента таксономии.

Если в поле $field не передано ни одно из значений: 'slug', 'name', 'term_taxonomy_id', то термин будет получаться по ID и управление полностью передается функции get_term(), которая работает быстрее чем get_term_by().

Еще одно отличие этой функции от get_term() - если термин получается не по ID, то результат будет получен на прямую из БД, а не из кэша, даже если он есть. А в get_term() объектный кэш работает всегда. Поэтому, если есть возможность пользуйтесь лучше get_term() или указывайте здесь в параметр $field 'id'.

✈ 1 раз = 0.00072с = медленно | 50000 раз = 28.0с = медленно

Хуков нет.

Возвращает

Массив/объект/false. Строку базы данных в указанном формате (массив/объект). Массив будет содержать следующие данные:

stdClass Object (
	[term_id]          => 9
	[name]             => Админка
	[slug]             => adminka-wordpress
	[term_group]       => 0
	[term_taxonomy_id] => 9
	[taxonomy]         => category
	[description]      => 
	[parent]           => 3
	[count]            => 3
	[filter]           => raw
)

Вернет false, если таксономии не существует или термин в ней не был найден.

Предупреждение: все поля массива возвращаются как строки, term_id в том числе. Поэтому перед дальнейшем использованием преобразуйте числовые значения в числа, где это необходимо.

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

get_term_by( $field, $value, $taxonomy, $output, $filter );
$field(строка) (обязательный)

Поле в БД, по которому будет производиться поиск параметра $value, может быть:

  • slug - по альтернативному названию;
  • name - по названию;
  • term_taxonomy_id - по идентификатору таксономии термина;
  • id - по идентификатору термина.
$value(строка/число) (обязательный)
Значение которое нужно найти.
$taxonomy(строка)
Название таксономии, category, post_tag или название произвольной таксономии.
С версии 4.4. этот параметр является не обязательным, если в $field указано term_taxonomy_id.
$output(строка)

Каким видом массива возвращать данные:

  • OBJECT - объект, конвертирует в объект WP_Term.
  • ARRAY_A - ассоциативный массив;
  • ARRAY_N - индексированный массив.

По умолчанию: OBJECT

$filter(строка)

Тип фильтрации. Одно из значений:

  • raw - просто вернет значение
  • edit - фильтр esc_html() если это поле description, и фильтр esc_attr() если другое поле.
  • db
  • slug
  • rss
  • attribute - фильтр esc_attr()
  • js - фильтр esc_js()

Смотрите параметр $context у функции sanitize_term_field(). Или загляните в код функции.
По умолчанию: 'raw'

Примеры

#1 Примеры как получить термины разных таксономий

// Получим рубрику "Новости" по её имени:
$term = get_term_by('name', 'Новости', 'category');

// Получим данные метки (таксономия post_tag) 
// альтернативное название (слаг) которой metka:
$term = get_term_by('slug', 'metka', 'post_tag');

// Получим термин "Новости" из таксономии "my_custom_taxonomy" по его имени:
$term = get_term_by('name', 'Новости', 'my_custom_taxonomy');

В результате этих примеров переменная $term будет содержать подобный объект:

stdClass Object
(
	[term_id] => 80
	[name] => Моя Рубрика
	[slug] => moya-rubrika
	[term_group] => 0
	[term_taxonomy_id] => 87
	[taxonomy] => my_tax
	[description] =>
	[parent] => 0
	[count] => 5
)

#2 Получение рубрики поста

Этот пример показывает, как получить все данные первой рубрики поста, с использованием get_term_by:

// получаем все рубрики текущего поста
$postCategories = get_the_category( $post->ID );

// собираем данные о всех рубриках поста в $myCategories
foreach ( $postCategories as $postCategory ) {
	$myCategories[] = get_term_by( 'id', $postCategory->cat_ID, 'category' );
}
// тут $myCategories содержит данные всех рубрик поста

// Первую рубрику поста можно получить так:
$myCategory = get_term_by('id', $postCategories[0]->cat_ID, 'category');

Это демонстрационный пример. По идее get_the_category() возвращает массив со всеми данными рубрики и, например, данные первые категории будут содержаться в первом элементе массива: $postCategories[0].

Заметки

  • Важно: значение параметра $value не очищается, для поля 'name'в первом параметре $field, если нужно очистить это делается отдельно.

  • Использует: sanitize_term(). Чистит элемент на основе правил фильтра указанного в параметре $filter

Код get term by: wp-includes/taxonomy.php WP 4.8.2

<?php
function get_term_by( $field, $value, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) {

	// 'term_taxonomy_id' lookups don't require taxonomy checks.
	if ( 'term_taxonomy_id' !== $field && ! taxonomy_exists( $taxonomy ) ) {
		return false;
	}

	// No need to perform a query for empty 'slug' or 'name'.
	if ( 'slug' === $field || 'name' === $field ) {
		$value = (string) $value;

		if ( 0 === strlen( $value ) ) {
			return false;
		}
	}

	if ( 'id' === $field || 'term_id' === $field ) {
		$term = get_term( (int) $value, $taxonomy, $output, $filter );
		if ( is_wp_error( $term ) || null === $term ) {
			$term = false;
		}
		return $term;
	}

	$args = array(
		'get'                    => 'all',
		'number'                 => 1,
		'taxonomy'               => $taxonomy,
		'update_term_meta_cache' => false,
		'orderby'                => 'none',
		'suppress_filter'        => true,
	);

	switch ( $field ) {
		case 'slug' :
			$args['slug'] = $value;
			break;
		case 'name' :
			$args['name'] = $value;
			break;
		case 'term_taxonomy_id' :
			$args['term_taxonomy_id'] = $value;
			unset( $args[ 'taxonomy' ] );
			break;
		default :
			return false;
	}

	$terms = get_terms( $args );
	if ( is_wp_error( $terms ) || empty( $terms ) ) {
		return false;
	}

	$term = array_shift( $terms );

	// In the case of 'term_taxonomy_id', override the provided `$taxonomy` with whatever we find in the db.
	if ( 'term_taxonomy_id' === $field ) {
		$taxonomy = $term->taxonomy;
	}

	return get_term( $term, $taxonomy, $output, $filter );
}

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

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

Еще из раздела: Любые таксономии

get_term_by 11 комментариев
Полезные 1 Вопросы 1 Все
  • campusboy1837 cайт: wp-plus.ru

    Из за того, что не владею PHP дня два промучался. Изучил эту статью, даже в английскую версию заглянул. Не получается и всё! Пришлось спросить на гугл.ответах и там дали оперативно ответ, вот пишу, вдруг кто-то тоже будет "тупить" как я. В общем решил посчитать сколько записей у меня в метке "Нерешенные задачи". Вставляю код - пусто! Оказывается, надо ещё его и вывсети на экран. В результате вот такой код:

    <?php $term = get_term_by('slug', 'zadaniya-bez-otveta', 'post_tag'); echo $term->count; ?>
    Ответить3.5 года назад #
  • Дмитрий1837 cайт: wp-plus.ru

    Пожалуйста, добавьте больше примеров с пользовательскими таксономиями. С метками вот получилось. Вывожу чисто записей в определенной метке. Теперь решил сделать новую таксономию. "Статус", а в нем дочерние элементы "Включен" и "Выключен". Получается вытянуть количество записей вообше в "Статус", а вот сколько записей в "Включен", к примеру, посчитать не могу sad В чем может быть причина?

    Ответить3.4 года назад #
    • Kama4489

      Не понятно немного что у вас не получается. У вас Статус - это термин таксономии у которого есть дочерние термины Включен и Выключен?

      Что касается подсчета записей принадлежащих термину. За это отвечает параметр update_count_callback для функции register_taxonomy() при регистрации таксономии. В этом параметре должна указывать функция, которая считает записи. По идее, должно работать автоматически. И этот параметр указывать не надо.

      1
      Ответить3.4 года назад #
  • Руслан

    Добрый день, Тимур.
    Подскажите, пожалуйста.
    Хочу добавить к терминам таксономии дополнительные поля, помимо [name], [slag], [description]. Например, такая таксономия как artist. Добавляю к ней поле [url].
    Посмотрел в интернете, все делают это через вот эту функцию:

    function save_extra_artist_fields($term_id){
    	//сбор всех данных, связанных с этой новой таксономией
    	$term = get_term($term_id,'artist');
    	$term_slug = $term->slug;
    	//сбор данных из пользовательских полей
    	$term_artist_site_url = esc_html($_POST['artist_site_url']);
    	//сохранение информации из пользовательских полей в таблице wp-options
    	update_option('term_artist_site_url_' . $term_slug, $term_artist_site_url);
    }
    add_action('create_artist','save_extra_artist_fields');

    Но получается, что эти данные записываются в таблицу wp_options, и они никак не связаны с $term.
    Но как мне кажется, логичнее было бы записать все в массив $term:

    $term = get_term($term_id,'artist');
    echo $term->url;

    Подскажите, почему все пользуются update_option(), вместо того, что бы добавлять данные в массив $term?
    И как лучше это было бы реализовать?
    Спасибо.

    Ответить2.3 года назад #
    • campusboy1837 cайт: wp-plus.ru

      Может это вам поможет? Статья Тимура Taxonomy Metadata: метаданные для таксономий.

      Ответить2.3 года назад #
      • Руслан

        Я так понимаю, плагин создает свою таблицу. А мне бы без использованию лишних таблиц, засунуть все в массив $term. И не париться. Я знаю, как это сделать, но вот меня интересует, почему другие так не делают. Из-за сложности удаления следов при дезактивации данной функции, или что? Вот, что меня интересует.
        Спасибо.

        Ответить2.3 года назад #
        • Kama4489

          В какой массив, где этот массив у вас в итоге храниться? wacko По-любому куда-то сохранять надо или в опции, или добавить поле в wp_terms или создать новую таблицу (плагин Taxonomy Metadata).

          Ответить2.3 года назад #
          • Руслан

            Ну, конечно, сохранять надо) Я же не сказал, что вообще без использования таблиц, а без использования лишних таблиц.
            Хочу использовать родные таблицы WordPress.
            А точнее массив, что выводиться по этой вот самой функции get_term_by(), что хранит всю информацию об элементе таксономии.

            $term = get_term_by('id', $term_id, 'artist');

            И как и в вашем примере переменна $term будет содержать подобный объект, только с элементом массива [url]:

            stdClass Object
            (
            	[term_id] => 80
            	[name] => Вася Пупкин
            	[slug] => vasya-pupkin
            	[term_group] => 0
            	[term_taxonomy_id] => 87
            	[taxonomy] => artist
            	[description] =>
            	[parent] => 0
            	[count] => 5
            	[url] => http://vasya-pupkin.ru
            )

            А далее я вывожу эти данные через ту же функцию:

            $term = get_term_by('id', $term_id, 'artist');
            echo $term->name;
            echo $term->url;

            А не как в примере, что я описал, в первом комментарии.
            Хочу хранить все "в одной коробочке". Надеюсь теперь понятно)

            Ответить2.3 года назад #
            • Kama4489

              Вам нужно добавить дополнительное поле в таблицу wp_terms. SQL запрос примерно такой буде:

              ALTER TABLE `wp_terms` ADD `myurl` TEXT NOT NULL DEFAULT '';
              Ответить2.3 года назад #
  • костя cайт: mbch.guide @

    сколько не воротил коды, так и не понял...
    у меня есть пост, внутри него я прописываю функцию, которая печатает информацию из файла - так легче редактировать множество постов.

    проблема не была проблемой, пока не появился ряд постов с ":" - файл так назвать нельзя.
    и чтобы не переименовывать кучу постов, мне нужно взять slug текущего поста - его я и подставлю в ссылку на файл. как это можно сделать?

    Ответить2 месяца назад #
    • костя cайт: mbch.guide @

      до этого проблем не было - просто брал название поста, а этими двоеточиями...

      Ответить2 месяца назад #

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

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