Функция, позволяющая получить (и вывести на сайте) элементы таксономий (рубрик, меток или кастомных таксономий) и информацию о них.
Если же надо получить текущий элемент таксономии, то воспользуйтесь функциями get_query_var() (co значением параметра равным term
— так вы получите ярлык текущего элемента таксономии) и get_term_by() (со значением первого параметра равным slug
).
Возвращает | При условии |
---|---|
Массив объектов элементов таксономий WP_Term. | По умолчанию. |
Массив из ID элементов таксономий. | Параметр fields установлен в значение ids . |
Массив из названий терминов. | Параметр fields установлен в значение names . |
Ассоциативный массив состоящих из ID элементов и ID их родителей. | Параметр fields равен id=>parent . |
Число элементов таксономий удовлетворяющих условиям. | Параметр fields равен count . |
Array() Пустой массив. | Если терминов не найдено. |
Объект класса WP_Error. | Хотя бы одной из таксономий, переданных в параметре taxonomy не существует. |
get_terms( $args = array(), $deprecated = '' )
Раньше в первый параметр функции мы передавали название таксономии, а во второй – все параметры функции. Теперь же название таксономии передаётся также в массив $args
параметром taxonomy
.
$args
(строка|массив) параметры по типу, как в WP_Query, их тоже можно записать и в виде массива и в виде строки.
taxonomy
(строка|массив) название таксономии или массив таксономий, например array( 'category', 'post_tag' )
.
number
(целое число) количество элементов, которые нужно вывести, по умолчанию выводятся все.
offset
(целое число) сколько элементов нужно пропустить, то есть если offset=2
, то начинаем с третьего.
include
(целое число|строка|массив) укажите ID элементов, которые нужно вывести, можно указать число, числа через запятую в виде строки или одномерный массив чисел, например так:
$categories = get_terms( array( 'taxonomy' => 'category', 'include' => 1 ) );
или так:
$categories = get_terms( array( 'taxonomy' => 'category', 'include' => array( 1, 4 ) ) );
или даже так:
$args = array( 'taxonomy' => 'category', 'include' => array( 1, 4 ) ); $categories = get_terms( $args );
Если вы хотите исключить какие-то элементы, не пытайтесь использовать минус перед числом, просто смотрите следующий параметр.
exclude
(целое число|строка|массив) укажите ID элементов, которые нужно исключить.
exclude_tree
(целое число|строка|массив) если вы исключате родительские элементы и хотите сразу же исключить все дочерние, то этот параметр для вас.
orderby
(строка) сортировать по:
id
— по ID элементов (по умолчанию),parent
— по ID родительских элементов,count
— по количеству постов,name
— по имени,slug
— по ярлыку,term_group
— по значениям колонки term_group в таблице wp_terms базы данных,include
— в том же порядке, в котором указаны элементы в параметре include,meta_value
и meta_value_num
– по значению произвольного поля,none
— без сортировки;order
(строка) порядок сортировки.
hide_empty
(логическое) нужно ли добавлять в результат также и пустые (без постов) рубрики/метки/элементы таксономий:
true
— не нужно (по умолчанию),false
— нужно;fields
(строка) в каком виде выводить результат:
all
— массив объектов элементов таксономий (по умолчанию), после print_r() он будет выглядеть так:$categories = get_terms( array( 'taxonomy' => 'category' ) ); print_r( $categories ); /* Результат: Array ( [0] => stdClass Object ( [term_id] => 1 [name] => Заметки [slug] => notes [term_group] => 0 [menu_order] => 0 [term_taxonomy_id] => 1 [taxonomy] => category [description] => [parent] => 0 [count] => 7 ) [1] => stdClass Object ( [term_id] => 4 [name] => Новости [slug] => news [term_group] => 0 [menu_order] => 0 [term_taxonomy_id] => 4 [taxonomy] => category [description] => [parent] => 0 [count] => 2 ) [2] => stdClass Object ( [term_id] => 11 [name] => Обновления [slug] => updates [term_group] => 0 [menu_order] => 0 [term_taxonomy_id] => 11 [taxonomy] => category [description] => [parent] => 4 [count] => 1 ) ) */
ids
— массив составленный из ID элементов, вот как он будет выглядеть, если пропустить его через функцию print_r()
$categories = get_terms( array( 'taxonomy' => 'category', 'fields' => 'ids' ) ); print_r( $categories ); /* Результат: Array ( [0] => 1 [1] => 4 [2] => 11 ) */
names
— возвращает массив наименований, например:$categories = get_terms( array( 'taxonomy' => 'category', 'fields' => 'names' ) ); print_r( $categories ); /* Результат: Array ( [0] => Новости [1] => Заметки ) */
count
— (с версии 3.2) возвращает количество всех элементов таксономии, вне зависимости от других параметров. Для этих целей вы также можете использовать wp_count_terms().$categories = get_terms( array( 'taxonomy' => 'category', 'fields' => 'count' ) ); echo $categories; /* Результат: 4 */
id=>parent
— ассоциативный массив состоящих из ID элементов и ID их родителей, если родительского элемента не существует, то возвращается 0, пример:$categories = get_terms( array( 'taxonomy' => 'category', 'fields' => 'id=>parent' ) ); print_r( $categories ); /* Результат: Array ( [1] => 0 [4] => 0 [11] => 4 ) */
slug
(строка) возвращает элементы, ярлыки которых совпадают с заданным значением.
hierarchical
(логическое) нужно ли включить в результат родительские элементы, даже если в них нет постов?
name__like
(строка) возвращает только те элементы, названия которых начинаются с заданного значения (без чувствительности в регистру), например:
// выведем через пробел все метки, начинающиеся с буквы "н" $tags = get_terms( array( 'taxonomy' => 'post_tag', 'name__like' => 'н' ) ); foreach( $tags as $tag ){ echo $tag->name . ' '; }
search
(строка) возвращает только те элементы, названия которых содержат заданное значение (без чувствительности в регистру).
pad_counts
(логическое) влияет только на числовые значения количества постов в родительских элементах.
get
(строка)
offset
, hide_empty
, child_of
(по умолчанию — пустая строка)child_of
(целое число) вывести все элементы таксономии, которые являются дочерними для элемента с указанным ID вне зависимости от уровня вложенности.
parent
(целое число) вывести элементы таксономии, которые являются дочерними для элемента с указанным ID и находятся на первом уровне вложенности. Если указать 0, то будут выведены только элементы верхнего уровня.
meta_key
(строка) Укажите это значение ключа мета поля, если хотите получить только элементы таксономи, содержащие его.
meta_value
(строка) Значение мета поля элементов таксономии для указанного ключа meta_key
.
meta_query
(массив) Работает так же, как и meta_query
в WP_Query при выводе постов. О нём даже есть отдельный урок.
childless
(логическое) Принимает значения true
/false
. При установке в значени true
, функция пропустит все термины, у которых есть дочерние элементы.
cache_domain
(строка) (с версии 3.2) если вы планируете использовать get_terms()
с указанными параметрами несколько раз, укажите в качестве значения cache_domain
уникальную фразу, чтобы задействовать кэш (по умолчанию — «core»).
Если параметр fields
не изменен, то функция возвращает массив объектов WP_Term
, каждый из которых содержит следующую информацию об элементе таксономии.
term_id
– ID рубрики/метки/элемента таксономииname
– названиеslug
– ярлыкterm_group
– значение term_group из базы данных (особого применения пока что нет, в основном — в плагинах)term_taxonomy_id
– ID таксономииtaxonomy
– название таксономииdescription
– описание элемента (можно заполнить в админке при создании и редактировании)parent
– ID родительского элементаcount
– количество записейorder
– номер по порядку при ручной сортировкеИли чекайте первый пример ниже.
Прежде, чем мы перейдём к более практическим примерам, давайте посмотрим, что возвращает get_terms()
при помощи PHP-функции print_r()
.
print_r( get_terms( array( 'taxonomy' => 'category' ) ) ); /* Array ( [2] => WP_Term Object ( [term_id] => 42 [name] => Лайфстайл [slug] => lajfstajl [term_group] => 0 [term_taxonomy_id] => 42 [taxonomy] => category [description] => [parent] => 0 [count] => 1 [filter] => raw [order] => 0 ) [4] => WP_Term Object ( [term_id] => 1 [name] => Трэвел [slug] => travel [term_group] => 0 [term_taxonomy_id] => 1 [taxonomy] => category [description] => [parent] => 0 [count] => 4 [filter] => raw [order] => 4 ) ) */
Приведу сразу же несложный пример с кучей комментов, иначе, как мне кажется, если я начну с документации функции, то некоторым будет непонятно, как её использовать.
// вытаскиваем все рубрики в массив $categories, описание параметров функции смотрите чуть ниже $categories = get_terms( array( 'taxonomy' => 'category', 'orderby' => 'name', 'hide_empty' => 0 ) ); // если рубрики, соответствующие заданным параметрам, существуют if( $categories ){ // тогда создаем выпадающий список из них echo '<select>'; // обращаемся к каждому объекту массива (в данном случае рубрика) foreach ( $categories as $cat ){ // выводим элемент списка, где атрибут value равен ID рубрики, а $cat->name - название рубрики echo "<option value=\"{$cat->term_id}\">{$cat->name}</option>"; } echo '</select>'; }
Вот что у меня получилось в результате выполнения этого кода на тестовом сайте:
Слева — сам список (открытый), а справа его HTML-код.
В этом примере параметры функции задаются в виде массива:
$number = 5; // ради интереса вынесем переменную отдельно $args = array( 'taxonomy' => 'category', 'number' => $number, 'orderby' => 'count', 'order' => 'DESC', ); $terms = get_terms( $args ); if( $terms ){ echo '<ul>'; foreach( $terms as $term ) { echo '<li>' . $term->name . ' (' . $term->count . ')</li>'; } echo '</ul>'; }
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Здравствуйте Михаил. Подскажите пожалуйста, как узнать ID категории в посте пользовательской таксаномии ?
Я разобрался, как этого можно добиться, если надо получить ID из вордпресовских разделов и оно работает вот код. Но вот, как добиться того же с пастами пользовательской таксаномии не могу понять.
Здравствуйте!
Доброго дня.
Вопрос по первому примеру (вывод терминов таксономии в выпадающий список).
Можно ли реализовать иерархический выпадающий список терминов произвольной таксономии, как это делается для иерархии категорий с помощью wp_dropdown_categories() ?
Добрый день!
В функции
wp_dropdown_categories()
есть параметрtaxonomy
.Спасибо, я вчера подумал в ту же сторону и перестал изобретать велосипед. Использовал wp_dropdown_categories(). Не работал сабмит, но это удалось победить прикручиванием джаваскрипта.
А как сделать что бы вместо ( term_id) выводилась ссылка ?
Вот то, что вам нужно get_term_link().
Здравствуйте, спасибо за ценный сайт!
Подскажите, пожалуйста: нужно в архиве таксономии вывести списком дочернии таксономии. В рубриках я сделал это так:
Но нигде не могу найти аналог, как сделать это в произвольной таксономии.
???
Здравствуйте!
Для того, чтобы вывести дочерние таксономии, вам вполне подойдёт функция
get_terms()
, то есть наша задача стоит в том, чтобы выяснить ID текущей таксономии на странице её архива для того, чтобы передать в параметр функцииchild_of
илиparent
(какой вам больше подходит).В этом нам поможет get_query_var().
В общем вот примерный код:
Миша, а Вы не могли бы дать код уже обернутый в php теги, а то я в этом не силен, и делаю методом многих тыков...
А этот код поверг меня в растерянность
Ну а это уже зависит куда его вставлять :)
Вообще теги так то
<?php
и?>
, но если они уже открыты, то второй раз не нужны.Код вставляется на страницу архива таксономии. После кода
ставлю Ваш
И ничего не показывает.
Может быть, мне в Вашем коде где-то надо подставить свои значения?
А, так вы посмотрите, как
get_terms()
работает, не зря же вы под ней комментарий поставили, я просто не стал дописывать до конца :)что то я последний комментарий совсем не понял. что где посмотреть то?
так на этой же странице всё есть :)
смотрю в статью как баран на новые ворота, хоть подскажите, в какой части смотреть?
нужно подставить значения term, taxonomy и slug ?
так вроде я пробовал, не выходит
Просто сразу после моего кода добавьте.
Прекрасно, заработало!
Но.
А как сделать так, чтобы дочерние таксономии были ссылками? Иначе ведь смысл то какой их выводить...
И как сделать, чтобы посты дочерней таксономии не выводились тогда в родительском архиве?
Точно-точно,
поменять
на
При помощи pre_get_posts. Тут уже готового кода на руках нет.
Миша, здравствуйте!
Подскажите, пожалуйста. Все подсказанное мне выше очень хорошо получилось.
Но когда в таксономии выведены ссылки на дочерние таксономии, а под ними каша из постов всех (и родительской и дочерних) то смысл теряется.
В рубриках я это решил вот таким кодом в functions^
Но для таксономий не работает.
Понимаю, что надо изменить слово is_category в данном куске кода.
Но на что изменить?
Здравствуйте!
Если просто нужно изменить is_category, то попробуйте поменять на is_tax
вставляю такой код
после предыдущего, при обновлении страницы сайта - белая страница пустая
может, надо еще category__in на что-то менять?
Да, вы правы, нужно заменить на
tax_query
. Синтаксис подробно описан здесь, и там как раз есть параметрinclude_children
.Только обрадовался, пошел ставить, но не тут то было.
Ставлю такой код в function
Но не работает.
Правда, уже не ломает сайт, не делает его пустыми белыми страницами.
Но просто нет никакого эффекта.
Миша, где же косяк?
Не всё так просто, Алексей, смотрите внимательно какой там синтаксис.
get_queried_object_id()
это по идее ID, а значит будет примерно так:Ок, дело сдвинулось с мертвой точки, но вылез новый косяк.
Когда пишу в функции это:
то оно начинает работать и действительно в архиве родительской таксономии не выводит записи дочерней.
НО!
Ломает код, который мы с таким трудом создавали для вывода таксономий на страницах архивов.
и последний код выводит на каждой странице таксономии ВСЕ таксономии маркированным списком.
Ну не одна каша (из постов), так другая (из заголовков).
Что-же теперь не так?
Я бы рекомендовал всё-таки в данном случае не модифицировать цикл через
pre_get_posts
, а сделать это при помощиquery_posts()
, самый последний пример в этой статье.час от часу не легче.
То есть, прекратить мучить файл function и внести изменения в файл taxonomy?
попробовал экспериментировать, но сайт ломается :(
Миша, а как убрать количество постов в скобках?
Алексей, если вы просто попробуете удалить из этой строчки кода то, что считаете нужным, ничего плохого с сайтом не случится.
Прошу прощения, просто вопрос, который вы задаёте, не требует знаний кода — только немного логики.
Ок, сработало. Спасибо!