Описание
Получает все элементы (термины) указанной таксономии.
get_terms() используется в: get_tags(), get_all_category_ids(), get_categories().
Функция возвращает массив объектов, содержащих в себе данные об элементах таксономии.
Использование
<?php get_terms( $taxonomies, $args ) ?>
Параметры по умолчанию
<?php
$args = array(
'number' => 0
,'offset' => 0
,'orderby' => 'id'
,'order' => 'ASC'
,'hide_empty' => true
,'fields' => 'all'
,'slug' => ''
,'hierarchical' => true
,'name__like' => ''
,'pad_counts' => false
,'get' => ''
,'child_of' => 0
,'parent' => ''
);
$myterms = get_terms('', $args);
?>
Параметры
- $taxonomies (строка/массив) (обязательный)
- Таксономии, элементы которых нужно получить. Можно указать одну таксономию "my_tax" или несколько arra('category', 'tax2').
По умолчанию: "" - $args (строка/массив)
- Аргументы, в соответствии с которыми будет получен результат.
По умолчанию: массив аргуметнов по умолчанию
Аргументы параметра $args
- number (число)
- Максимальное количество элементов, которые будут получены. Лимит. По умолчанию все.
По умолчанию: 0 - offset (число)
- Верхний отступ в запросе. Сколько первых элементов пропустить. Указывать нужно число. По умолчанию без отступов.
По умолчанию: 0 - orderby (строка)
- Поле по которому сортировать результат. Может быть:
- id - по ID - По умолчанию;
- count - по количеству записей;
- name - по названию;
- slug - по альтернативному названию;
- term_group - по группе;
- none - не сортировать.
По умолчанию: "id"
- order (строка)
- Направление сортировки, указанной в параметре "orderby":
- ASC - по порядку, от меньшего к большему (1, 2, 3; a, b, c);
- DESC - в обратном порядке, от большего к меньшему (3, 2, 1; c, b, a).
По умолчанию: "ASC"
- hide_empty (логический)
- Возвращать ли термины в которых нет записей (пустые). 1(true) - возвращать пустые, 0(false) - не возвращать пустые.
По умолчанию: true - fields (строка)
- Какие поля возвращать в результирующем массиве. Может быть:
- all - Вернуть массив объектов (все данные) - по умолчанию;
- ids - вернуть массив чисел;
- names - вернуть массив строк.
По умолчанию: 'all'
- slug (строка)
- Вернуть термины, альтернативное название (slug) которых совпадает c указанной строкой.
По умолчанию: '' - hierarchical (логический)
- Включать в результат не пустые термины "родители" которых пустые (без записей). Т.е. в массив будут включены пустые термины, если у дочерних им терминах есть записи, даже если аргумент 'hide_empty' выставлен в true.
- true - да, включить;
- false - нет, не включать.
По умолчанию: true
- name__like (строка)
- Показать термины название которых совпадает с этим аргументом.
По умолчанию: '' - pad_counts (логический)
- Если передать true, то число которое показывает количество записей в родительских категориях будет суммой своих записей и записей из дочерних категорий. По умолчанию подсчитываются только свои записи.
По умолчанию: false - get (строка)
- По умолчанию пустая строка. Позволяет перезаписывать аргументы 'hide_empty' и 'child_of'. (зачем это надо не понял).
По умолчанию: '' - child_of (число)
- ID родительского термина. Вывести элементы таксономии, которые являются дочерними разделами указанного элемента. Будут получены все уровни вложенности, все дерево.
По умолчанию: '' - parent (число)
- ID родительского термина. Вывести термины родителем которых является указанный термин, т.е. будут получен только первый уровень вложенности, а не все дерево как в параметре child_of. Если указать 0, то будут выведены термины верхнего уровня. По умолчанию пустая строка.
По умолчанию: ''
Примеры
1. Получим массив данных о всех категориях на сайте. Данные в массиве будут отсортированы по количеству записей (orderby=count) в каждой категории. Категории у которых нет записей все равно будут включены в массив (hide_empty=0).
$myterms = get_terms('category', 'orderby=count&hide_empty=0');
1.2. Получим все разделы ссылок:
$mylinks_categories = get_terms('link_category', 'orderby=count&hide_empty=0');
2. Выведем на экран список названий всех разделов таксономии "my_taxonomy":
$terms = get_terms("my_taxonomy");
$count = count($terms);
if($count > 0){
echo "<ul>";
foreach ($terms as $term) {
echo "<li>".$term->name."</li>";
}
echo "</ul>";
}
В данном примере каждый $term из цикла foreach ($terms as $term), будет содержать подобную информацию:
[term_id] => 162 [name] => Здоровье [slug] => zdorove [term_group] => 0 [term_taxonomy_id] => 170 [taxonomy] => articles [description] => [parent] => 0 [count] => 2
На заметку
- Использует фильтр 'get_terms', когда нужный термин найден в кэше. Фильтр срабатывает для каждого термина, до того как он попадет в итоговый массив.
- Использует фильтр 'list_terms_exclusions', который фильтрует итоговый результат, учитывая аргументы параметра $args
get_terms()
из файла: /wp-includes/taxonomy.php WP 3.3.2function &get_terms($taxonomies, $args = '') {
global $wpdb;
$empty_array = array();
$single_taxonomy = false;
if ( !is_array($taxonomies) ) {
$single_taxonomy = true;
$taxonomies = array($taxonomies);
}
foreach ( $taxonomies as $taxonomy ) {
if ( ! taxonomy_exists($taxonomy) ) {
$error = new WP_Error('invalid_taxonomy', __('Invalid Taxonomy'));
return $error;
}
}
$defaults = array('orderby' => 'name', 'order' => 'ASC',
'hide_empty' => true, 'exclude' => array(), 'exclude_tree' => array(), 'include' => array(),
'number' => '', 'fields' => 'all', 'slug' => '', 'parent' => '',
'hierarchical' => true, 'child_of' => 0, 'get' => '', 'name__like' => '',
'pad_counts' => false, 'offset' => '', 'search' => '', 'cache_domain' => 'core' );
$args = wp_parse_args( $args, $defaults );
$args['number'] = absint( $args['number'] );
$args['offset'] = absint( $args['offset'] );
if ( !$single_taxonomy || !is_taxonomy_hierarchical($taxonomies[0]) ||
'' !== $args['parent'] ) {
$args['child_of'] = 0;
$args['hierarchical'] = false;
$args['pad_counts'] = false;
}
if ( 'all' == $args['get'] ) {
$args['child_of'] = 0;
$args['hide_empty'] = 0;
$args['hierarchical'] = false;
$args['pad_counts'] = false;
}
$args = apply_filters( 'get_terms_args', $args, $taxonomies );
extract($args, EXTR_SKIP);
if ( $child_of ) {
$hierarchy = _get_term_hierarchy($taxonomies[0]);
if ( !isset($hierarchy[$child_of]) )
return $empty_array;
}
if ( $parent ) {
$hierarchy = _get_term_hierarchy($taxonomies[0]);
if ( !isset($hierarchy[$parent]) )
return $empty_array;
}
// $args can be whatever, only use the args defined in defaults to compute the key
$filter_key = ( has_filter('list_terms_exclusions') ) ? serialize($GLOBALS['wp_filter']['list_terms_exclusions']) : '';
$key = md5( serialize( compact(array_keys($defaults)) ) . serialize( $taxonomies ) . $filter_key );
$last_changed = wp_cache_get('last_changed', 'terms');
if ( !$last_changed ) {
$last_changed = time();
wp_cache_set('last_changed', $last_changed, 'terms');
}
$cache_key = "get_terms:$key:$last_changed";
$cache = wp_cache_get( $cache_key, 'terms' );
if ( false !== $cache ) {
$cache = apply_filters('get_terms', $cache, $taxonomies, $args);
return $cache;
}
$_orderby = strtolower($orderby);
if ( 'count' == $_orderby )
$orderby = 'tt.count';
else if ( 'name' == $_orderby )
$orderby = 't.name';
else if ( 'slug' == $_orderby )
$orderby = 't.slug';
else if ( 'term_group' == $_orderby )
$orderby = 't.term_group';
else if ( 'none' == $_orderby )
$orderby = '';
elseif ( empty($_orderby) || 'id' == $_orderby )
$orderby = 't.term_id';
else
$orderby = 't.name';
$orderby = apply_filters( 'get_terms_orderby', $orderby, $args );
if ( !empty($orderby) )
$orderby = "ORDER BY $orderby";
else
$order = '';
$order = strtoupper( $order );
if ( '' !== $order && !in_array( $order, array( 'ASC', 'DESC' ) ) )
$order = 'ASC';
$where = "tt.taxonomy IN ('" . implode("', '", $taxonomies) . "')";
$inclusions = '';
if ( !empty($include) ) {
$exclude = '';
$exclude_tree = '';
$interms = wp_parse_id_list($include);
foreach ( $interms as $interm ) {
if ( empty($inclusions) )
$inclusions = ' AND ( t.term_id = ' . intval($interm) . ' ';
else
$inclusions .= ' OR t.term_id = ' . intval($interm) . ' ';
}
}
if ( !empty($inclusions) )
$inclusions .= ')';
$where .= $inclusions;
$exclusions = '';
if ( !empty( $exclude_tree ) ) {
$excluded_trunks = wp_parse_id_list($exclude_tree);
foreach ( $excluded_trunks as $extrunk ) {
$excluded_children = (array) get_terms($taxonomies[0], array('child_of' => intval($extrunk), 'fields' => 'ids', 'hide_empty' => 0));
$excluded_children[] = $extrunk;
foreach( $excluded_children as $exterm ) {
if ( empty($exclusions) )
$exclusions = ' AND ( t.term_id <> ' . intval($exterm) . ' ';
else
$exclusions .= ' AND t.term_id <> ' . intval($exterm) . ' ';
}
}
}
if ( !empty($exclude) ) {
$exterms = wp_parse_id_list($exclude);
foreach ( $exterms as $exterm ) {
if ( empty($exclusions) )
$exclusions = ' AND ( t.term_id <> ' . intval($exterm) . ' ';
else
$exclusions .= ' AND t.term_id <> ' . intval($exterm) . ' ';
}
}
if ( !empty($exclusions) )
$exclusions .= ')';
$exclusions = apply_filters('list_terms_exclusions', $exclusions, $args );
$where .= $exclusions;
if ( !empty($slug) ) {
$slug = sanitize_title($slug);
$where .= " AND t.slug = '$slug'";
}
if ( !empty($name__like) ) {
$name__like = like_escape( $name__like );
$where .= $wpdb->prepare( " AND t.name LIKE %s", $name__like . '%' );
}
if ( '' !== $parent ) {
$parent = (int) $parent;
$where .= " AND tt.parent = '$parent'";
}
if ( $hide_empty && !$hierarchical )
$where .= ' AND tt.count > 0';
// don't limit the query results when we have to descend the family tree
if ( ! empty($number) && ! $hierarchical && empty( $child_of ) && '' === $parent ) {
if ( $offset )
$limits = 'LIMIT ' . $offset . ',' . $number;
else
$limits = 'LIMIT ' . $number;
} else {
$limits = '';
}
if ( !empty($search) ) {
$search = like_escape($search);
$where .= $wpdb->prepare( " AND (t.name LIKE %s)", '%' . $search . '%');
}
$selects = array();
switch ( $fields ) {
case 'all':
$selects = array('t.*', 'tt.*');
break;
case 'ids':
case 'id=>parent':
$selects = array('t.term_id', 'tt.parent', 'tt.count');
break;
case 'names':
$selects = array('t.term_id', 'tt.parent', 'tt.count', 't.name');
break;
case 'count':
$orderby = '';
$order = '';
$selects = array('COUNT(*)');
}
$_fields = $fields;
$fields = implode(', ', apply_filters( 'get_terms_fields', $selects, $args ));
$join = "INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id";
$pieces = array( 'fields', 'join', 'where', 'orderby', 'order', 'limits' );
$clauses = apply_filters( 'terms_clauses', compact( $pieces ), $taxonomies, $args );
foreach ( $pieces as $piece )
$$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : '';
$query = "SELECT $fields FROM $wpdb->terms AS t $join WHERE $where $orderby $order $limits";
$fields = $_fields;
if ( 'count' == $fields ) {
$term_count = $wpdb->get_var($query);
return $term_count;
}
$terms = $wpdb->get_results($query);
if ( 'all' == $fields ) {
update_term_cache($terms);
}
if ( empty($terms) ) {
wp_cache_add( $cache_key, array(), 'terms', 86400 ); // one day
$terms = apply_filters('get_terms', array(), $taxonomies, $args);
return $terms;
}
if ( $child_of ) {
$children = _get_term_hierarchy($taxonomies[0]);
if ( ! empty($children) )
$terms = & _get_term_children($child_of, $terms, $taxonomies[0]);
}
// Update term counts to include children.
if ( $pad_counts && 'all' == $fields )
_pad_term_counts($terms, $taxonomies[0]);
// Make sure we show empty categories that have children.
if ( $hierarchical && $hide_empty && is_array($terms) ) {
foreach ( $terms as $k => $term ) {
if ( ! $term->count ) {
$children = _get_term_children($term->term_id, $terms, $taxonomies[0]);
if ( is_array($children) )
foreach ( $children as $child )
if ( $child->count )
continue 2;
// It really is empty
unset($terms[$k]);
}
}
}
reset ( $terms );
$_terms = array();
if ( 'id=>parent' == $fields ) {
while ( $term = array_shift($terms) )
$_terms[$term->term_id] = $term->parent;
$terms = $_terms;
} elseif ( 'ids' == $fields ) {
while ( $term = array_shift($terms) )
$_terms[] = $term->term_id;
$terms = $_terms;
} elseif ( 'names' == $fields ) {
while ( $term = array_shift($terms) )
$_terms[] = $term->name;
$terms = $_terms;
}
if ( 0 < $number && intval(@count($terms)) > $number ) {
$terms = array_slice($terms, $offset, $number);
}
wp_cache_add( $cache_key, $terms, 'terms', 86400 ); // one day
$terms = apply_filters('get_terms', $terms, $taxonomies, $args);
return $terms;
}Связанные Функции
- get_term_link() view
- get_term_children() view
- wp_set_object_terms() view
- the_terms() view
- has_term() view
Ещё из раздела
Смотрите также: Функции WordPress и Теги Шаблона.

привет.
а если нужно, чтобы все элементы списка были ссылками на страницы терминов? как это сделать?
С помощью функции get_term_link().
спасибо. еще днем про нее читал, но так и не понял, как правильно это сделать.
я так понимаю, нужно добавить $link, но как правильно обернуть ссылкой
и где взять term ID так и не смог понять. сделал с помощью wp_tag_cloud, но такой вариант не нравится.
$terms = get_terms("my_taxonomy"); if( count($terms) > 0 ){ echo "<ul>"; foreach ($terms as $term) { echo '<li><a href="'. get_term_link($term) .'">'. $term->name .'</a></li>'; } echo "</ul>"; }П.С. изменил комментарий, была ошибка.
большое спасибо!
Добрый день.
а как можно вывести ссылку на родительскую таксономию? Чтобы в тексте было так:
родительская таксономия -> дочерняя таксономия
если включен и настроен ЧПУ, то можно, например так: