function get_terms( $args = array(), $deprecated = '' ) { $term_query = new WP_Term_Query(); $defaults = array( 'suppress_filter' => false, ); /* * Legacy argument format ($taxonomy, $args) takes precedence. * * We detect legacy argument format by checking if * (a) a second non-empty parameter is passed, or * (b) the first parameter shares no keys with the default array (ie, it's a list of taxonomies) */ $_args = wp_parse_args( $args ); $key_intersect = array_intersect_key( $term_query->query_var_defaults, (array) $_args ); $do_legacy_args = $deprecated || empty( $key_intersect ); if ( $do_legacy_args ) { $taxonomies = (array) $args; $args = wp_parse_args( $deprecated, $defaults ); $args['taxonomy'] = $taxonomies; } else { $args = wp_parse_args( $args, $defaults ); if ( isset( $args['taxonomy'] ) && null !== $args['taxonomy'] ) { $args['taxonomy'] = (array) $args['taxonomy']; } } if ( ! empty( $args['taxonomy'] ) ) { foreach ( $args['taxonomy'] as $taxonomy ) { if ( ! taxonomy_exists( $taxonomy ) ) { return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); } } } // Don't pass suppress_filter to WP_Term_Query.
suppress_filter = $args['suppress_filter']; unset( $args['suppress_filter'] ); $terms = $term_query->query( $args ); // Count queries are not filtered, for legacy reasons. if ( ! is_array( $terms ) ) { return $terms; } if ( $suppress_filter ) { return $terms; } /** * Filters the found terms. * * @since 2.3.0 * @since 4.6.0 Added the `$term_query` parameter. * * @param array $terms Array of found terms. * @param array $taxonomies An array of taxonomies. * @param array $args An array of get_terms() arguments. * @param WP_Term_Query $term_query The WP_Term_Query object. */ return apply_filters( 'get_terms', $terms, $term_query->query_vars['taxonomy'], $term_query->query_vars, $term_query ); }
developer.wordpress.org
Signature
get_terms( $args = array(), $deprecated = '' )
- args
- (string|array) Optional. Array or string of arguments. See WP_Term_Query::__construct() for information on accepted arguments. Default empty.
Default:array()
- deprecated
- (array) Argument array, when using the legacy function parameter format. If present, this parameter will be interpreted as `$args`, and the first function parameter will be parsed as a taxonomy or array of taxonomies.
Default:''
Return
(array|int|WP_Error) List of WP_Term instances and their children. Will return WP_Error, if any of $taxonomies do not exist.
Source
function get_terms( $args = array(), $deprecated = '' ) { $term_query = new WP_Term_Query(); $defaults = array( 'suppress_filter' => false, ); /* * Legacy argument format ($taxonomy, $args) takes precedence. * * We detect legacy argument format by checking if * (a) a second non-empty parameter is passed, or * (b) the first parameter shares no keys with the default array (ie, it's a list of taxonomies) */ $_args = wp_parse_args( $args ); $key_intersect = array_intersect_key( $term_query->query_var_defaults, (array) $_args ); $do_legacy_args = $deprecated || empty( $key_intersect ); if ( $do_legacy_args ) { $taxonomies = (array) $args;
45 more lines...
WP Trac GitHub
queryposts.com
Package: WordPressTaxonomy
Since: 2.3.0
Since: 4.2.0 Introduced ‘name’ and ‘childless’ parameters.
Since: 4.4.0 Introduced the ability to pass ‘term_id’ as an alias of ‘id’ for the orderby
parameter. Introduced the ‘meta_query’ and ‘update_term_meta_cache’ parameters. Converted to return a list of WP_Term objects.
Type: string $orderby Field(s) to order terms by. Accepts term fields (‘name’, ‘slug’, ‘term_group’, ‘term_id’, ‘id’, ‘description’), ‘count’ for term taxonomy count, ‘include’ to match the ‘order’ of the $include param, or ‘none’ to skip ORDER BY. Defaults to ‘name’.
Type: string $order Whether to order terms in ascending or descending order. Accepts ‘ASC’ (ascending) or ‘DESC’ (descending). Default ‘ASC’.
Type: bool|int $hide_empty Whether to hide terms not assigned to any posts. Accepts 1|true or 0|false. Default 1|true.
Type: array|string $include Array or comma/space-separated string of term ids to include. Default empty array.
Type: array|string $exclude Array or comma/space-separated string of term ids to exclude.
$include is non-empty, $exclude is ignored. Default empty array.
Type: array|string $exclude_tree Array or comma/space-separated string of term ids to exclude along with all of their descendant terms. If $include is non-empty, $exclude_tree is ignored. Default empty array.
Type: int|string $number Maximum number of terms to return. Accepts »|0 (all) or any positive number. Default »|0 (all).
Type: int $offset The number by which to offset the terms query. Default empty.
Type: string $fields Term fields to query for. Accepts ‘all’ (returns an array of complete term objects), ‘ids’ (returns an array of ids), ‘id=>parent’ (returns an associative array with ids as keys, parent term IDs as values), ‘names’ (returns an array of term names), ‘count’ (returns the number of matching terms), ‘id=>name’ (returns an associative array with ids as keys, term names as values), or ‘id=>slug’ (returns an associative array with ids as keys, term slugs as values). Default ‘all’.
Type: string|array $name Optional. Name or array of names to return term(s) for. Default empty.
Type: string|array $slug Optional. Slug or array of slugs to return term(s) for. Default empty.
Type: bool $hierarchical Whether to include terms that have non-empty descendants (even if $hide_empty is set to true).
fault true.
Type: string $search Search criteria to match terms. Will be SQL-formatted with wildcards before and after. Default empty.
Type: string $name__like Retrieve terms with criteria by which a term is LIKE $name__like. Default empty.
Type: string $description__like Retrieve terms where the description is LIKE $description__like. Default empty.
Type: bool $pad_counts Whether to pad the quantity of a term’s children in the quantity of each term’s «count» object variable. Default false.
Type: string $get Whether to return terms regardless of ancestry or whether the terms are empty. Accepts ‘all’ or empty (disabled). Default empty.
Type: int $child_of Term ID to retrieve child terms of. If multiple taxonomies are passed, $child_of is ignored. Default 0.
Type: int|string $parent Parent term ID to retrieve direct-child terms of. Default empty.
Type: bool $childless True to limit results to terms that have no children. This parameter has no effect on non-hierarchical taxonomies. Default false.
Type: string $cache_domain Unique cache key to be produced when this query is stored in an object cache. Default is ‘core’.
Type: bool $update_term_meta_cache Whether to prime meta caches for matched terms. Default true.
Type: array $meta_query Meta query clauses to limit retrieved terms by. See
WP_Meta_Query
. Default empty. }
Located at wp-includes/taxonomy-functions.php
apigen.juzna.cz
First you need to get the available taxonomies so that you can pass them to the
wp_get_object_terms
function to get all of the terms / categories / tags / custom tax terms associated with a single post:
$taxonomies = get_taxonomies('','names'); print_r($taxonomies); //optional for debugging
That will likely return something like this:
Array ( [category] => category [post_tag] => post_tag [nav_menu] => nav_menu [link_category] => link_category [post_format] => post_format [product_type] => product_type [product_cat] => product_cat [product_tag] => product_tag [product_shipping_class] => product_shipping_class [shop_order_status] => shop_order_status )
Next you can use the wp_get_object_terms
function, passing the post’s ID(s) and the list of taxonomies to get all of the terms associated:
global $post; //optional if you are inside the "loop" $terms = wp_get_object_terms($post->ID,$taxonomies); print_r($terms); //optional for debugging Array ( [0] => stdClass Object ( [term_id] => 2 [name] => Blogroll [slug] => blogroll [term_group] => 0 [term_taxonomy_id] => 2 [taxonomy] => link_category [description] => [parent] => 0 [count] => 7 ) [1] => stdClass Object ( [term_id] => 14 [name] => Lightweight [slug] => lightweight [term_group] => 0 [term_taxonomy_id] => 14 [taxonomy] => product_cat [description] => [parent] => 0 [count] => 1 ) [2] => stdClass Object ( [term_id] => 15 [name] => tag1 [slug] => tag1 [term_group] => 0 [term_taxonomy_id] => 15 [taxonomy] => product_tag [description] => [parent] => 0 [count] => 1 ) [3] => stdClass Object ( [term_id] => 5 [name] => simple [slug] => simple [term_group] => 0 [term_taxonomy_id] => 5 [taxonomy] => product_type [description] => [parent] => 0 [count] => 1 ) )
And that’s how you get all terms for a post in wordpress. I decided to write this after unsuccessfully searching for the terms below. Leave a comment if this helped you or if you have a fix / improvement / question.
- wordpress get all terms post
- wordpress get all taxonomies
- wordpress get all terms
- wordpress get all terms post
140a441624a1d6b0f83e393234556298
techblog.willshouse.com
У меня есть иерархическая пользовательская таксономия, которую я могу отображать с помощью print_r(get_the_terms( $post->ID, 'taxonomic_rank' ));
:
Array ( [46] => stdClass Object ( [term_id] => 46 [name] => Aplocheilidae [slug] => aplocheilidae [term_group] => 0 [term_taxonomy_id] => 53 [taxonomy] => taxonomic_ranks [description] => [parent] => 39 [count] => 1 [object_id] => 443 ) [47] => stdClass Object ( [term_id] => 47 [name] => Aplocheilus [slug] => aplocheilus [term_group] => 0 [term_taxonomy_id] => 54 [taxonomy] => taxonomic_ranks [description] => [parent] => 46 [count] => 1 [object_id] => 443 ) [39] => stdClass Object ( [term_id] => 39 [name] => Cyprinodontiformes [slug] => cyprinodontiformes [term_group] => 0 [term_taxonomy_id] => 52 [taxonomy] => taxonomic_ranks [description] => [parent] => 0 [count] => 1 [object_id] => 443 ) )
Эта таксономия всегда будет иметь следующий вид: Орден (родитель)> Семья (ребенок ордена)> Подсемейство (ребенок семьи)
- Контент для конкретной страны
- Пользовательские отношения таксономии (например: классификация растений)
- Как отобразить пользовательское поле из пользовательской таксономии в файле single.php?
- Таксономии: отображение иерархического родительского списка
- Многопользовательские проблемы с таксономией
- Как сделать обычную почтовую таксономию похожей на обычные категории?
Есть ли быстрый и простой способ отображения этих таксономий в правильном порядке, чтобы я мог распечатать следующую строку? Order: <order>, Family: <family>, Sub-family: <sub-family>
заранее спасибо
Solutions Collecting From Web of «Пользовательская таксономия, get_the_terms, перечисление в порядке родительского> дочернего»
www.wordpressask.com
Эти функции похожи:
get_the_terms
возвращает информацию о термах заданной таксономии, привязанных к заданному посту;wp_get_object_terms
возвращает информацию о термах одной или нескольких таксономий, привязанных к одному или нескольким постам, а также имеет ряд дополнительных опций.
Кроме этого каждая из них обладает другими особенностями, о которых надо знать.
Функция wp_get_object_terms
более сложна в применении и является базовой: она формирует SQL-запрос, получает от БД данные и обрабатывает их в соответствии с аргументами. Свой результат она не кеширует, а обращение к БД производит при каждом вызове.
Первые два аргумента — $post_ids
и $taxonomies
— могут быть как значениями, так и массивами значений. Третий аргумент — $args
— опциональный массив дополнительных параметров, позволяющих
- определять поле и порядок сортировки (параметры
orderby
иorder
); - задавать вид возвращаемых значений (параметр
fields
); - фильтровать термы по терму-родителю (параметр
parent
; для иерархичных таксономий).
За точным определением аргументов рекомендуется обратиться к кодексу (см. wp_get_object_terms на кодексе) и к исходникам (см. wp-includes/taxonomy.php
).
Замечание следует сделать только о значениях 'all'
и 'all_with_object_id'
параметра 'field'
, т. к. на момент публикации данной заметки их описания на кодексе были одинаковыми: «all matching term’s objects will be returned» — «будут возвращены объекты всех подходящих термов».
В обоих случаях функция возвращает массив объектов с информацией о термах — их структура описана в заметке Параметры терма в WordPress.
По умолчанию полю 'fields'
присваивается значение 'all'
.
Различия между 'all'
и 'all_with_object_id'
проявляются при запросе термов для множества постов:
- если
'fields'
имеет значение'all_with_object_id'
, в результат включаются все термы каждого из заданных постов: в описывающих термы структурах имеется полеobject_id
с идентификатором обладающего термом поста; - если установлен
'all'
(или если'fields'
не задан явно), результирующий массив содержит структуры термов, каждый из которых прикреплен хотя бы к одному из заданных постов; полеobject_id
у структур отсутствует, повторов термов в массиве нет.
Значение 'all_with_object_id'
полезно, когда требуется получить информацию по каждому посту в наборе. Вся информация извлекается из БД одним запросом, поэтому один такой вызов выгоднее нескольких, сделанных для каждого поста и/или каждой таксономии в отдельности. Точно также один вызов с 'all*'
обойдётся дешевле нескольких с одиночными полями (names
, slugs
, ids
).
При обоих вариантах 'all*'
происходит кеширование полученных термов (но не результата функции). Поэтому
- при получении тех же термов вызовом
get_term
обращения к БД не потребуется; - после вызова с
all_with_object_id
терм кешируется с полемobject_id
— при получении такого терма отget_term
это поле следует игнорировать; - кешированностью термов
wp_get_object_terms
никак не руководствуется и выполняет запрос к БД при каждом вызове.
Возвращаемое значение всегда является либо массивом, либо объектом класса WP_Error
, если к.-л. из заданных таксономий не была зарегистрирована. Если подходящие термы не найдены, итоговый массив будет пуст. Такое может произойти в случае, когда посты с указанными идентификаторами отсутствуют или не имеют термов заданных таксономий, а также когда родитель ни одного из прикреплённых термов не соответствует указанному в аргументе 'parent'
.
Перед возвратом массива функция фильтрует его по двум хукам:
'get_object_terms'
, получающий в аргументах:- фильтруемый массив
$terms
, - массив идентификаторов постов
$object_id_array
, - массив таксономий
$taxonomy_array
, - массив аргументов
$args
.
Идентификаторы постов и имена таксономий всегда передаются фильтру в виде массивов, даже если соотв. аргументы вызова
wp_get_object_terms
были одинарными значениями.- фильтруемый массив
'wp_get_object_terms'
, получающий в аргументах:- фильтруемый массив
$terms
; - строку с идентификаторами постов, разделёнными запятыми
$object_ids
; - строку с именами таксономий, разделёнными замятыми и взятыми в апострофы
$taxonomies
; - массив аргументов
$args
.
Строки с идентификаторами постов и таксономиями фильтру передаются те же, что использовались функцией для построения SQL-запросов.
- фильтруемый массив
Фильтры выполняются друг за другом непосредственно перед завершением функции.
Отдавать предпочтение функции wp_get_object_terms
следует, если
- необходимо получить термы для нескольких постов и/или нескольких таксономий;
- необходимо получить только к.-л. один параметр термов (имена, ярлыки или идентификаторы);
- не ожидается многократных вызовов функции с одинаковыми аргументами (в ходе обработки одного http-запроса);
- кеширование результата предусмотрено вызывающей функцией;
- количество обращений к БД не имеет значения (напр., при работе в админской консоли, происходящей значительно реже простых посещений сайта).
Замечание: если выполняется запрос идентификаторов ('fields' => 'ids'
), после которого для каждого из них терм извлекается вызовом get_term
, то выгоднее будет запросить термы полностью ('fields' => 'all'
или не задан), а результат обработать вызовом wp_list_pluck($terms, 'term_id')
. В этом случае вызовы get_term
обращения к БД производить не будут.
Функция get_the_terms
более проста в применении и работает только с одним постом и одной таксономией:
Первым аргументом может быть как идентификатор, так и объект поста.
Особенностью функции является кеширование её результата, поэтому при повторных вызовах с теми же аргументами обращений к БД не потребуется. Перед возвратом массив термов прогоняется через одноимённый фильтр 'get_the_terms'
, вторым и третьим аргументами которого являются идентификатор поста и имя таксономии:
Самостоятельно к БД функция get_the_terms
не обращается — для этого она вызывает wp_get_object_terms
, являясь, таким образом, функцией-обёрткой. Вызов происходит так:
Непустой результат соответствует варианту 'fields' => 'all'
— массив объектов термов, либо экземпляр класса WP_Error
, когда таксономия неизвестна. Если подходящих термов пост не имеет, вместо пустого массива функция get_the_terms
вернёт false
.
P.S.: есть ещё одна похожая функция — wp_get_post_terms
. Она также является обёрткой над wp_get_object_terms
, но отличается от неё лишь тем, что принимает единственный идентификатор поста. В остальном она полностью идентична wp_get_object_terms
.
Резюме
- функция
wp_get_object_terms
является базовой, функцияget_the_terms
её использует; - функция
wp_get_object_terms
не кеширует свой результат, функцияget_the_terms
— кеширует; - обе функции фильтруют результат перед его возвратом:
wp_get_object_terms
— по хукам'get_object_terms'
и'wp_get_object_terms'
;get_the_terms
— по хуку'get_the_terms'
;
- если посты подходящих термов не имеют,
wp_get_object_terms
возвращает пустой массив, аget_the_terms
— значениеfalse
; - функция
wp_get_object_terms
предпочтительна- при одновременной работе со множеством постов и/или таксономий;
- при отсутствии нужды в кешировании или при самостоятельной его реализации;
- при работе только с идентификаторами, только с ярлыками или только с именами термов;
- при необходимости сортировать результат по к.-л. полю в определённом направлении;
- при необходимости фильтрации по родительскому терму (для иерархических таксономий);
- когда количество обращений к БД не имеет значения (при отображении или применении к.-л. настроек, например);
- функция
get_the_terms
предпочтительна при- работе с одним постом и одной таксономией;
- высокой вероятности повторных вызовов с теми же аргументами.
got-quadrat.ru
Выводим отсортированные по имени рубрики в виде выпадающего списка
Приведу сразу же несложный пример с кучей комментов, иначе, как мне кажется, если я начну с документации функции, то некоторым будет непонятно, как её использовать.
Вот что у меня получилось в результате выполнения этого кода на тестовом сайте:
Слева — сам список (открытый), а справа его HTML-код.
Синтаксис
$taxonomies
(строка|массив) таксономия или массив таксономий, элементы которых нам нужны.
$args
(строка|массив) параметры по типу, как в WP_Query, их тоже можно записать и в виде массива и в виде строки.
Параметры массива $args
number
(целое число) количество элементов, которые нужно вывести, по умолчанию выводятся все.
offset
(целое число) сколько элементов нужно пропустить, то есть если offset=2, то начинаем с третьего.
include
(целое число|строка|массив) укажите ID элементов, которые нужно вывести, можно указать число, числа через запятую в виде строки или одномерный массив чисел, например так:
или так:
или даже так:
Если вы хотите исключить какие-то элементы, не пытайтесь использовать минус перед числом, просто смотрите следующий параметр.
exclude
(целое число|строка|массив) укажите ID элементов, которые нужно исключить.
orderby
(строка) сортировать по:
- id — по ID элементов (по умолчанию),
- count — по количеству постов,
- name — по имени,
- slug — по ярлыку,
- term_group — по значениям колонки term_group в таблице wp_terms базы данных,
- none — без сортировки;
order
(строка) порядок сортировки.
- ASC — по возрастанию (по умолчанию),
- DESC — по убыванию;
hide_empty
(логическое) нужно ли добавлять в результат также и пустые (без постов) рубрики/метки/элементы таксономий:
true
— не нужно (по умолчанию),false
— нужно;
fields
(строка) в каком виде выводить результат:
- all — массив объектов элементов таксономий (по умолчанию), после print_r() он будет выглядеть так:
- ids — массив составленный из ID элементов, вот как он будет выглядеть, если пропустить его через функцию
print_r()
: - names — возвращает массив наименований, например:
- count — (с версии 3.2) возвращает количество всех элементов таксономии, вне зависимости от других параметров. Для этих целей вы также можете использовать wp_count_terms().
- id=>parent — ассоциативный массив состоящих из ID элементов и ID их родителей, если родительского элемента не существует, то возвращается 0, пример:
slug
(строка) возвращает элементы, ярлыки которых совпадают с заданным значением.
hierarchical
(логическое) нужно ли включить в результат родительские элементы, даже если в них нет постов?
- 1 — нужно (по умолчанию),
- 0 — не нужно;
name__like
(строка) возвращает только те элементы, названия которых начинаются с заданного значения (без чувствительности в регистру), например:
search
(строка) возвращает только те элементы, названия которых содержат заданное значение (без чувствительности в регистру).
pad_counts
(логическое) влияет только на числовые значения количества постов в родительских элементах.
- 1 — количество постов родительского элемента суммируется с количеством постов дочерних элементов,
- 0 — не суммируется (по умолчанию);
get
(строка)
- all — вывести все элементы, вне зависимости от параметров offset, hide_empty, child_of (по умолчанию — пустая строка)
child_of
(целое число) вывести все элементы таксономии, которые являются дочерними для элемента с указанным ID вне зависимости от уровня вложенности.
parent
(целое число) вывести элементы таксономии, которые являются дочерними для элемента с указанным ID и находятся на первом уровне вложенности. Если указать 0, то будут выведены только элементы верхнего уровня.
cache_domain
(строка) (с версии 3.2) если вы планируете использовать get_terms с указанными параметрами несколько раз, укажите в качестве значения cache_domain уникальную фразу, чтобы задействовать кэш (по умолчанию — «core»).
Возвращаемые значения
Если параметр fields не изменен, то функция возвращает массив объектов, каждый из которых содержит следующую информацию об элементе таксономии.
- term_id — ID рубрики/метки/элемента таксономии
- name — название
- slug — ярлык
- term_group — значение term_group из базы данных (особого применения пока что нет, в основном — в плагинах)
- term_taxonomy_id — ID таксономии
- taxonomy — название таксономии
- description — описание элемента (можно заполнить в админке при создании и редактировании)
- parent — ID родительского элемента
- count — количество записей
Выводим список из 5-и рубрик, отсортированных по количеству записей
В этом примере параметры функции задаются в виде массива:
Тот же самый пример, но только с заданными в виде строки параметрами:
misha.blog
Примеры
Получение названия элемента таксономии по его ID
Во всех последующих примерах буду использовать элемент таксономии product_category
(тут может быть любая ваш таксономия, либо вовсе — рубрики или метки) с ID 555 (опять-таки, скорее всего вы будете передавать ID в функцию не напрямую, а через переменную и другие функции, в данном случае это просто для примера).
Выводим описание элемента таксономии, заданное в админке
Вообще, тут уже есть отдельная функция для вывода описания term_description(), но для простоты кода, можно сразу вытащить всё это добро из объекта (если вы уже воспользовались функцией get_term()
и объект имеется у вас на руках).
Выводим ссылку на страницу категории (элемента таксономии)
Как ни странно, в возвращаемом объекте содержится всё, кроме ссылки на страницу с архивами рубрики. Конечно, там есть ярлык, однако его недостаточно для правильного построения ссылки, к счастью есть отличная функция, которая позволяет выводить нормальную ссылку вне зависимости от настроек постоянных ссылок и прочей ерунды — get_term_link().
В принципе все примеры там уже приведены и всё же вот ещё один:
У функции get_term_link()
есть некоторые свои особенности, но в двух словах — в качестве параметра лучше всего передавать весь объект и не париться.
Все остальные параметры возвращаемого объекта уже перечислены в этом посту (ссылка с якорем — сразу перекинет на параметры).
Получение результата в виде ассоциативного массива
Тут на самом деле всё просто, возьмем второй пример например и переделаем его:
Результат в виде нумерованного массива
Этот вариант лично мне кажется мягко говоря не удобным, но всё же покажу и его. Опять тот же самый пример:
Как узнать необходимые индексы? Ну, можно взглянуть на массив через PHP-функцию print_r()
:
misha.blog