get_term_by() WP 2.3.0
Получает указанный элемент таксономии (термин). Получить термин можно по: имени (названию), ярлыку (слагу) или по ID элемента таксономии.
Значение не очищается для поля name
, вам нужно делать это самостоятельно.
Если в поле $field
не передано ни одно из значений: slug
, name
, term_taxonomy_id
, то термин будет получаться по ID и управление полностью передается функции get_term(), которая работает быстрее чем get_term_by()
.
Еще одно отличие этой функции от get_term()
- если термин получается не по ID, то результат будет получен напрямую из БД, а не из кэша, даже если он есть. А в get_term()
объектный кэш работает всегда. Поэтому, если есть возможность пользуйтесь лучше get_term()
или указывайте здесь в параметр $field=id
.
Хуков нет.
Возвращает
Массив/объект/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
- 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
VER 4.9.5
Cвязанные функции
Из метки: term (термины таксономий)
- get_term()
- get_term_children()
- get_term_field()
- get_term_link()
- get_terms()
- get_the_term_list()
- get_the_terms()
- has_term()
Еще из раздела: Любые таксономии
- edit_term_link()
- get_edit_term_link()
- get_taxonomies()
- get_taxonomy()
- is_taxonomy_hierarchical()
- register_taxonomy()
Из за того, что не владею PHP дня два промучался. Изучил эту статью, даже в английскую версию заглянул. Не получается и всё! Пришлось спросить на гугл.ответах и там дали оперативно ответ, вот пишу, вдруг кто-то тоже будет "тупить" как я. В общем решил посчитать сколько записей у меня в метке "Нерешенные задачи". Вставляю код - пусто! Оказывается, надо ещё его и вывсети на экран. В результате вот такой код:
Пожалуйста, добавьте больше примеров с пользовательскими таксономиями. С метками вот получилось. Вывожу чисто записей в определенной метке. Теперь решил сделать новую таксономию. "Статус", а в нем дочерние элементы "Включен" и "Выключен". Получается вытянуть количество записей вообше в "Статус", а вот сколько записей в "Включен", к примеру, посчитать не могу
В чем может быть причина?
Не понятно немного что у вас не получается. У вас Статус - это термин таксономии у которого есть дочерние термины Включен и Выключен?
Что касается подсчета записей принадлежащих термину. За это отвечает параметр update_count_callback для функции register_taxonomy() при регистрации таксономии. В этом параметре должна указывать функция, которая считает записи. По идее, должно работать автоматически. И этот параметр указывать не надо.
Добрый день, Тимур.
Подскажите, пожалуйста.
Хочу добавить к терминам таксономии дополнительные поля, помимо [name], [slag], [description]. Например, такая таксономия как artist. Добавляю к ней поле [url].
Посмотрел в интернете, все делают это через вот эту функцию:
Но получается, что эти данные записываются в таблицу wp_options, и они никак не связаны с $term.
Но как мне кажется, логичнее было бы записать все в массив $term:
Подскажите, почему все пользуются update_option(), вместо того, что бы добавлять данные в массив $term?
И как лучше это было бы реализовать?
Спасибо.
Может это вам поможет? Статья Тимура Taxonomy Metadata: метаданные для таксономий.
Я так понимаю, плагин создает свою таблицу. А мне бы без использованию лишних таблиц, засунуть все в массив $term. И не париться. Я знаю, как это сделать, но вот меня интересует, почему другие так не делают. Из-за сложности удаления следов при дезактивации данной функции, или что? Вот, что меня интересует.
Спасибо.
В какой массив, где этот массив у вас в итоге храниться?
По-любому куда-то сохранять надо или в опции, или добавить поле в wp_terms или создать новую таблицу (плагин Taxonomy Metadata).
Ну, конечно, сохранять надо) Я же не сказал, что вообще без использования таблиц, а без использования лишних таблиц.
Хочу использовать родные таблицы WordPress.
А точнее массив, что выводиться по этой вот самой функции get_term_by(), что хранит всю информацию об элементе таксономии.
И как и в вашем примере переменна $term будет содержать подобный объект, только с элементом массива [url]:
А далее я вывожу эти данные через ту же функцию:
А не как в примере, что я описал, в первом комментарии.
Хочу хранить все "в одной коробочке". Надеюсь теперь понятно)
Вам нужно добавить дополнительное поле в таблицу wp_terms. SQL запрос примерно такой буде:
сколько не воротил коды, так и не понял...
у меня есть пост, внутри него я прописываю функцию, которая печатает информацию из файла - так легче редактировать множество постов.
проблема не была проблемой, пока не появился ряд постов с ":" - файл так назвать нельзя.
и чтобы не переименовывать кучу постов, мне нужно взять slug текущего поста - его я и подставлю в ссылку на файл. как это можно сделать?
до этого проблем не было - просто брал название поста, а этими двоеточиями...
get_term_by() тоже работает с кэшем, только в отличии от get_term() проверяет его и получает только после передачи в get_terms() непосредственно перед запросом $wpdb->get_results() в WP_Term_Query. Важно отличие - кеш отдельный от get_term(), поэтому уже полученные объекты по ID в get_term() будут повторно запрашиваться из бд в случае, например, get_term_by( 'slug' ), но все get_term_by( 'slug' ) кэшируются в случае повторного запроса.