描述
您可以在发送查询之前将任何自定义项完全注入查询,并使用过滤器控制输出。
返回类型取决于传递给$args['fields']
的值。有关详细信息,请参阅WP_Term_Query::get_terms()。在所有情况下,如果请求的分类法无效,将返回WP_Error
对象。
当缓存具有分类项时,将调用‘get_terms’过滤器,并将找到的分类项与$taxonomies数组和$args数组一起传递给它。在传递分类项数组之前也会调用此过滤器,并传递分类项数组以及$taxonomies和$args。
‘list_terms_exclusions’过滤器将编译的排除分类项与$args一起传递。
‘get_terms_orderby’过滤器将查询的ORDER BY
子句与$args数组一起传递。
在4.5.0之前,get_terms()
的第一个参数是分类法或分类法列表:
$terms = get_terms( 'post_tag', array( 'hide_empty' => false, ) );
Since 4.5.0, taxonomies should be passed via the ‘taxonomy’ argument in the $args
array:
自4.5.0以来,分类法应通过$args
数组中的“taxonomy”参数传递:
$terms = get_terms( array( 'taxonomy' => 'post_tag', 'hide_empty' => false, ) );
参数
- $args
-
(array|string)(可选) 参数的数组或字符串。有关接受的参数的信息,请参阅WP_Term_Query::__construct()。
默认值: array()
- $deprecated
-
(array|string)(可选) 参数数组,当使用传统函数参数格式时。如果存在,该参数将被解释为
$args
,第一个函数参数将被解析为分类法或分类法数组。默认值: ''
返回
(WP_Term[]|int[]|string[]|string|WP_Error) 分类项(term)数组,其计数为数字字符串;如果不存在任何分类,返回WP_Error。有关更多信息,请参阅函数说明。
源码
更新日志
版本 | 描述 |
---|---|
4.8.0 | 引入了'suppress_filter'参数。 |
4.5.0 | 更改了函数签名,以便$args 数组可以作为第一个参数提供。引入了'meta_key'和'meta_value'参数。引入了按meta数据排序结果的功能。 |
4.4.0 | 引入了将'term_id'作为orderby 参数的'id'别名传递的功能。引入了'meta_query'和'update_term_meta_cache'参数。转换为返回WP_Term对象的列表。 |
4.2.0 | 引入了'name'和'childless'参数。 |
2.3.0 | 开始引入 |
使用示例
所有get_terms属性的默认值:
(我尝试了本文中的默认值,但不起作用。以下起作用了。)$get_terms_default_attributes = array ( 'taxonomy' => 'category', //empty string(''), false, 0 don't work, and return empty array 'orderby' => 'name', 'order' => 'ASC', 'hide_empty' => true, //can be 1, '1' too 'include' => 'all', //empty string(''), false, 0 don't work, and return empty array 'exclude' => 'all', //empty string(''), false, 0 don't work, and return empty array 'exclude_tree' => 'all', //empty string(''), false, 0 don't work, and return empty array 'number' => false, //can be 0, '0', '' too 'offset' => '', 'fields' => 'all', 'name' => '', 'slug' => '', 'hierarchical' => true, //can be 1, '1' too 'search' => '', 'name__like' => '', 'description__like' => '', 'pad_counts' => false, //can be 0, '0', '' too 'get' => '', 'child_of' => false, //can be 0, '0', '' too 'childless' => false, 'cache_domain' => 'core', 'update_term_meta_cache' => true, //can be 1, '1' too 'meta_query' => '', 'meta_key' => array(), 'meta_value'=> '', );
从WordPress 4.6.1开始,返回的数组如下(添加到上面Leo的帮助评论中)
array(1) { [0]=> object(WP_Term) (11) { ["term_id"]=> //int ["name"]=> //string ["slug"]=> //string ["term_group"]=> //int ["term_taxonomy_id"]=> //int ["taxonomy"]=> //string ["description"]=> //string ["parent"]=> //int ["count"]=> // int ["filter"]=> //string ["meta"]=> array(0) { // presumably this would be some returned meta-data? } } }
如果传递parent => 0,则只返回顶级分类项(term)
$terms = get_terms( array( 'taxonomy' => 'tax_name', 'parent' => 0 ) );
通过自定义分类法获取类别和子类别:
$taxonomies = get_terms( array( 'taxonomy' => 'taxonomy_name', 'hide_empty' => false ) ); if ( !empty($taxonomies) ) : $output = '<select>'; foreach( $taxonomies as $category ) { if( $category->parent == 0 ) { $output.= '<optgroup label="'. esc_attr( $category->name ) .'">'; foreach( $taxonomies as $subcategory ) { if($subcategory->parent == $category->term_id) { $output.= '<option value="'. esc_attr( $subcategory->term_id ) .'"> '. esc_html( $subcategory->name ) .'</option>'; } } $output.='</optgroup>'; } } $output.='</select>'; echo $output; endif;
使用高级自定义字段(字段类型:分类法,输出:对象)筛选分类法。
案例:创建一个包含由ACF字段定义的主要类别的过滤器,所有其他类别应属于*others*。
解决方案:
// Define Featured Category IDs first $featured_category_ids = array(); // It must be output WP_Object $featured_categories = get_field('main_category_filters'); // Creating loop to insert IDs to array. foreach( $featured_categories as $cat ) { $featured_category_ids[] = $cat->term_id; } // Now, if Featured Categories are match, add their IDs via 'exclude' if( $featured_categories ) { $args = array( 'taxonomy' => 'event_cat', 'parent' => 0, 'exclude' => $featured_category_ids ); } else { // If no featured, just display all terms $args = array( 'taxonomy' => 'event_cat', 'parent' => 0 ); } // Starting query terms now $other_categories = get_terms($args);
获取按计数排序的所有文章类别。
字符串语法:
$categories = get_terms( 'category', 'orderby=count&hide_empty=0' );
数组语法:
$categories = get_terms( 'category', array( 'orderby' => 'count', 'hide_empty' => 0, ) );
获取所有链接类别:
$my_links_categories = get_terms( 'link_category', 'orderby=count&hide_empty=0' );
列出自定义分类法中的所有分类项(term),无链接:
$terms = get_terms( 'my_taxonomy' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ echo '<ul>'; foreach ( $terms as $term ) { echo '<li>' . $term->name . '</li>'; } echo '</ul>'; }
列出所有分类项(term),并链接到分类项存档,由(·)分隔:
$args = array( 'hide_empty=0' ); $terms = get_terms( 'my_term', $args ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) { $count = count( $terms ); $i = 0; $term_list = '<p class="my_term-archive">'; foreach ( $terms as $term ) { $i++; $term_list .= '<a href="' . esc_url( get_term_link( $term ) ) . '" alt="' . esc_attr( sprintf( __( 'View all post filed under %s', 'my_localization_domain' ), $term->name ) ) . '">' . $term->name . '</a>'; if ( $count != $i ) { $term_list .= ' · '; } else { $term_list .= '</p>'; } } echo $term_list; }
获取按计数排序的所有文章类别。
字符串语法:
$categories = get_terms( 'category', 'orderby=count&hide_empty=0' );
数组语法:
$categories = get_terms( 'category', array( 'orderby' => 'count', 'hide_empty' => 0 ) );
列出分类项(term)仅限于与特定meta数据键和数据值匹配的分类项
$terms= get_terms( array( 'taxonomy' => 'taxonomy name', 'meta_key' => 'metadata key', 'meta_value' => 'metadata value' ) );
获取与某个meta_key匹配的分类项(term)列表
$args = array( 'hide_empty' => false, 'meta_query' => array( array( 'key' => 'project_status', 'value' => 'New', 'compare' => '=' ) )); $projects = get_terms( 'Projects', $args );
如果由于某些奇怪的原因`get_terms`不起作用,自定义分类法未显示已注册,请尝试使用`WP_Term_Query`:
$term_query = new WP_Term_Query( array( 'taxonomy' => 'regions', // <-- Custom Taxonomy name.. 'orderby' => 'name', 'order' => 'ASC', 'child_of' => 0, 'parent' => 0, 'fields' => 'all', 'hide_empty' => false, ) ); // Show Array info echo '<pre>'; print_r( $term_query->terms ); echo '</pre>'; //Render html if ( ! empty( $term_query->terms ) ) { foreach ( $term_query->terms as $term ) { echo wp_kses_post( $term->name ) . ", "; echo esc_html( $term->term_id ) . ", "; echo esc_html( $term->slug ) . ", "; echo "<br>"; } } else { echo 'No term found.'; }
从这里获取所有参数:WP_Term_Query::__construct()
自定义分类法和子类别列表。
您也可以使用它创建表格列表。$taxonomies = get_terms( array( 'taxonomy' => 'product_cat', //Custom taxonomy name 'hide_empty' => false ) ); if ( !empty($taxonomies) ) : foreach( $taxonomies as $category ) { if( $category->parent == 0 ) { //remove uncategorized from loop if( $category->slug == 'uncategorized' ){ continue; } //Parent category information echo esc_html__($category->name, 'text-domain'); echo esc_html__($category->description, 'text-domain'); echo esc_html__($category->slug, 'text-domain'); echo esc_html__($category->count, 'text-domain'); //Sub category information foreach( $taxonomies as $subcategory ) { if($subcategory->parent == $category->term_id) { echo esc_html__($subcategory->name, 'text-domain'); echo esc_html__($subcategory->description, 'text-domain'); echo esc_html__($subcategory->slug, 'text-domain'); echo esc_html__($subcategory->count, 'text-domain'); } } } } endif;
使用自定义字段进行meta查询,然后使用不同的自定义字段进行排序。
$terms = get_terms( array( 'taxonomy' => 'tax_slug', 'hide_empty' => false, 'meta_query' => array( [ 'key' => 'meta_key_slug_1', 'value' => 'desired value to look for' ] ), 'meta_key' => 'meta_key_slug_2', 'orderby' => 'meta_key_slug_2' ) );
按父项ID排序–未在文档中记录,但也有效。
$categories = get_terms( 'category', array( 'orderby' => 'parent', ) );
获取父分类法的所有子分类法
function get_child_taxonomies( $taxonomy_name, $termId, $args = array() ) { $defaults = array( 'taxonomy' => $taxonomy_name, 'orderby' => 'name', 'order' => 'ASC', 'hide_empty' => true, 'child_of' => $termId, ); $args = wp_parse_args( $args, $defaults ); $taxonomies = get_terms( $args ); if ( empty( $taxonomies ) || is_wp_error( $taxonomies ) ) { return false; } return $taxonomies; }
获取数组中的所有分类项(term)id和名称,用于生成下拉选择列表:
function custom_get_term_lit( $taxonomy = 'category' ) { $terms = get_terms( [ 'taxonomy' => $taxonomy, 'hide_empty' => false, ] ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) { return wp_list_pluck( $terms, 'name', 'term_id' ); } return false; } $category = custom_get_term_lit('custom-taxonomy-id'); echo "<select name='category' id='category-dropdown'>"; foreach ( $category as $cat_id => $cat_name ) { echo "<option value='" . esc_attr( $cat_id ) . "'>" . esc_html__( $cat_name, 'text-domain' ) . "</option>"; } echo "</select>";
以组织方式列出类别(或自定义分类法)和子类别
//parent category (then child(category) and subchild, then posts in each category ) $parent_ID = 0; //-level_one_clilds- $level_one_clilds = get_terms( array( 'taxonomy' => 'lecture_category', 'parent' => $parent_ID , 'depth' => 1, 'hide_empty' => false ) ); foreach( $level_one_clilds as $level_one_clild ): echo $level_one_clild->name . "<hr>" ; //--level_tow_clilds-- $level_tow_clilds = get_terms( array( 'taxonomy' => 'lecture_category', 'parent' => $level_one_clild->term_id, 'depth' => 1, 'hide_empty' => false )); foreach( $level_tow_clilds as $level_tow_clild ): echo "- " . $level_tow_clild->name . "<hr>" ; //---level_three_clild --- $level_three_clilds = get_terms( array( 'taxonomy' => 'lecture_category', 'parent' => $level_tow_clild->term_id, 'depth' => 1, 'hide_empty' => false )); foreach( $level_three_clilds as $level_three_clild ): echo "-- " . $level_three_clild->name . "<hr>" ; endforeach ; //level_three_clild endforeach ; //level_tow_clild endforeach ; //level_one_clilds
如果您将一个分类项(term)分配给了一篇文章以外的其他内容,这里有一个警告:
'hide_empty'
是默认为true,因此它只显示分配给文章的分类项。因此,如果您得到返回的空数组,请注意,默认情况下不会显示分配给附件的分类项(例如类别),除非您使用'hide_empty' => false
:$wpdocs_categories = get_terms( array( 'taxonomy' => 'category', 'hide_empty' => false, 'name__like' => 'foo' ) );
请注意以下代码:
$terms = get_terms( array( 'taxonomy' => 'class_languages', 'hide_empty' => false, ) );
可以返回有效分类项(term),但也可以返回
WP_Error
,例如,如果分类法无效…因此,仅此检查不足以避免代码中的错误:
if ( ! empty( $terms ) ) { // whatever code }
相反,最好使用以下方法:
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) { // whatever code }
循环分类并列出所有子类别。
$taxonomy = 'my_taxonomy'; function listTaxonomies($taxonomy,$term_id = '0') { $output = ''; $args = array( 'taxonomy' => $taxonomy, 'parent' => $term_id ); $categories = get_terms($args); if($categories) { $output.= '<div style="padding-left:2em;">'; foreach( $categories as $category ) { $output.= esc_attr( $category->name ) . ' (' . $category->slug . ')<br>'; $output.= listTaxonomies($taxonomy,$category->term_id); } $output.= '</div>'; } return $output; } listTaxonomies($taxonomy);
获取按首字母筛选的分类项(term)
$authors = get_terms('book-authors', array('name__like' => $first_l)); function custom_tax_query( $pieces, $taxonomies, $args ) { if ( 'book-authors' == $taxonomies[0] ) { $pieces['where'] = str_replace("LIKE '%", "LIKE '", $pieces['where']); } return $pieces; }
获取按meta键值排序的分类项:
$terms = get_terms( 'taxonomy_name', array( 'meta_key' => 'custom_meta_key', 'orderby' => 'custom_meta_key' ) );