Get terms wordpress

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 ); }


get_terms( $args = array(), $deprecated = '' )
 (string|array) Optional. Array or string of arguments. See WP_Term_Query::__construct() for information on accepted arguments. Default empty.
Default: array()

 (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: ''


(array|int|WP_Error) List of WP_Term instances and their children. Will return WP_Error, if any of $taxonomies do not exist.


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

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

Get all terms for a Post in WordPressFirst 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


У меня есть иерархическая пользовательская таксономия, которую я могу отображать с помощью 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, перечисление в порядке родительского> дочернего»

Эти функции похожи:

  • 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 предпочтительна при
    • работе с одним постом и одной таксономией;
    • высокой вероятности повторных вызовов с теми же аргументами.

Выводим отсортированные по имени рубрики в виде выпадающего списка

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

Вот что у меня получилось в результате выполнения этого кода на тестовом сайте:

Слева — сам список (открытый), а справа его HTML-код.


(строка|массив) таксономия или массив таксономий, элементы которых нам нужны.

(строка|массив) параметры по типу, как в WP_Query, их тоже можно записать и в виде массива и в виде строки.

Параметры массива $args

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

(целое число) сколько элементов нужно пропустить, то есть если offset=2, то начинаем с третьего.

(целое число|строка|массив) укажите ID элементов, которые нужно вывести, можно указать число, числа через запятую в виде строки или одномерный массив чисел, например так:

или так:

или даже так:

Если вы хотите исключить какие-то элементы, не пытайтесь использовать минус перед числом, просто смотрите следующий параметр.

(целое число|строка|массив) укажите ID элементов, которые нужно исключить.

(строка) сортировать по:

  • id — по ID элементов (по умолчанию),
  • count — по количеству постов,
  • name — по имени,
  • slug — по ярлыку,
  • term_group — по значениям колонки term_group в таблице wp_terms базы данных,
  • none — без сортировки;

(строка) порядок сортировки.

  • ASC — по возрастанию (по умолчанию),
  • DESC — по убыванию;

(логическое) нужно ли добавлять в результат также и пустые (без постов) рубрики/метки/элементы таксономий:

  • true — не нужно (по умолчанию),
  • false — нужно;

(строка) в каком виде выводить результат:

  • all — массив объектов элементов таксономий (по умолчанию), после print_r() он будет выглядеть так:
  • ids — массив составленный из ID элементов, вот как он будет выглядеть, если пропустить его через функцию print_r():
  • names — возвращает массив наименований, например:
  • count — (с версии 3.2) возвращает количество всех элементов таксономии, вне зависимости от других параметров. Для этих целей вы также можете использовать wp_count_terms().
  • id=>parent — ассоциативный массив состоящих из ID элементов и ID их родителей, если родительского элемента не существует, то возвращается 0, пример:

(строка) возвращает элементы, ярлыки которых совпадают с заданным значением.

(логическое) нужно ли включить в результат родительские элементы, даже если в них нет постов?

  • 1 — нужно (по умолчанию),
  • 0 — не нужно;

(строка) возвращает только те элементы, названия которых начинаются с заданного значения (без чувствительности в регистру), например:

(строка) возвращает только те элементы, названия которых содержат заданное значение (без чувствительности в регистру).

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

  • 1 — количество постов родительского элемента суммируется с количеством постов дочерних элементов,
  • 0 — не суммируется (по умолчанию);


  • all — вывести все элементы, вне зависимости от параметров offset, hide_empty, child_of (по умолчанию — пустая строка)

(целое число) вывести все элементы таксономии, которые являются дочерними для элемента с указанным ID вне зависимости от уровня вложенности.

(целое число) вывести элементы таксономии, которые являются дочерними для элемента с указанным ID и находятся на первом уровне вложенности. Если указать 0, то будут выведены только элементы верхнего уровня.

(строка) (с версии 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-и рубрик, отсортированных по количеству записей

В этом примере параметры функции задаются в виде массива:

Тот же самый пример, но только с заданными в виде строки параметрами:


Получение названия элемента таксономии по его ID

Во всех последующих примерах буду использовать элемент таксономии product_category (тут может быть любая ваш таксономия, либо вовсе — рубрики или метки) с ID 555 (опять-таки, скорее всего вы будете передавать ID в функцию не напрямую, а через переменную и другие функции, в данном случае это просто для примера).

Выводим описание элемента таксономии, заданное в админке

Вообще, тут уже есть отдельная функция для вывода описания term_description(), но для простоты кода, можно сразу вытащить всё это добро из объекта (если вы уже воспользовались функцией get_term() и объект имеется у вас на руках).

Выводим ссылку на страницу категории (элемента таксономии)

Как ни странно, в возвращаемом объекте содержится всё, кроме ссылки на страницу с архивами рубрики. Конечно, там есть ярлык, однако его недостаточно для правильного построения ссылки, к счастью есть отличная функция, которая позволяет выводить нормальную ссылку вне зависимости от настроек постоянных ссылок и прочей ерунды — get_term_link().

В принципе все примеры там уже приведены и всё же вот ещё один:

У функции get_term_link() есть некоторые свои особенности, но в двух словах — в качестве параметра лучше всего передавать весь объект и не париться.

Все остальные параметры возвращаемого объекта уже перечислены в этом посту (ссылка с якорем — сразу перекинет на параметры).

Получение результата в виде ассоциативного массива

Тут на самом деле всё просто, возьмем второй пример например и переделаем его:

Результат в виде нумерованного массива

Этот вариант лично мне кажется мягко говоря не удобным, но всё же покажу и его. Опять тот же самый пример:

Как узнать необходимые индексы? Ну, можно взглянуть на массив через PHP-функцию print_r():

You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.