当前浏览:首页 / WordPress函数 / get_terms()

get_terms( array|string $args = array(), array|string $deprecated = '' )

检索给定一个或多个分类法的分类项(term)

term 分类项more...


描述

您可以在发送查询之前将任何自定义项完全注入查询,并使用过滤器控制输出。

返回类型取决于传递给$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开始引入

使用示例

  • 示例1

    所有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'=> '',
    	);
  • 示例2

    从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?
        }
      }
    }
    
  • 示例3

    如果传递parent => 0,则只返回顶级分类项(term)

    $terms = get_terms( array( 
        'taxonomy' => 'tax_name',
        'parent'   => 0
    ) );
    
  • 示例4

    通过自定义分类法获取类别和子类别:

    $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;
  • 示例5

    使用高级自定义字段(字段类型:分类法,输出:对象)筛选分类法。

    案例:创建一个包含由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);
    
  • 示例6

    获取按计数排序的所有文章类别。

    字符串语法:

    $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 .= ' &middot; ';
    		}
    		else {
    			$term_list .= '</p>';
    		}
    	}
    	echo $term_list;
    }
    
  • 示例7

    获取按计数排序的所有文章类别。

    字符串语法:

    $categories = get_terms( 'category', 'orderby=count&hide_empty=0' );
    

    数组语法:

    $categories = get_terms( 'category', array(
     	'orderby'    => 'count',
     	'hide_empty' => 0
    ) );
    
  • 示例8

    列出分类项(term)仅限于与特定meta数据键和数据值匹配的分类项

        $terms= get_terms( array(
            'taxonomy' => 'taxonomy name',
            'meta_key' => 'metadata key',
            'meta_value' => 'metadata value'
        ) );
    
  • 示例9

    获取与某个meta_key匹配的分类项(term)列表

    $args = array(
        'hide_empty' => false, 
    	'meta_query' => array(
          array(
             'key'       => 'project_status',
             'value'     => 'New',
             'compare'   => '='
          )
     ));
    $projects = get_terms( 'Projects', $args );
  • 示例10

    如果由于某些奇怪的原因`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()

  • 示例11

    自定义分类法和子类别列表。
    您也可以使用它创建表格列表。

    $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;
    
  • 示例12

    使用自定义字段进行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'
    
    ) );
    
  • 示例13

    按父项ID排序–在文档中记录,但也有效。

    $categories = get_terms( 'category', array(
        'orderby'    => 'parent',
    ) );
    
  • 示例14

    获取父分类法的所有子分类法

    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;
    
    }
    
  • 示例15

    获取数组中的所有分类项(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>";
    
  • 示例16

    以组织方式列出类别(或自定义分类法)和子类别

            
            //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
            
    
  • 示例17

    如果您将一个分类项(term)分配给了一篇文章以外的其他内容,这里有一个警告:
    'hide_empty'默认为true,因此它只显示分配给文章的分类项。因此,如果您得到返回的空数组,请注意,默认情况下不会显示分配给附件的分类项(例如类别),除非您使用'hide_empty' => false

    $wpdocs_categories = get_terms( array(
    	'taxonomy' => 'category',
    	'hide_empty' => false,
    	'name__like' => 'foo'
    ) );
    
  • 示例18

    请注意以下代码:

    $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
    }
    
  • 示例19

    循环分类并列出所有子类别。

        $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);
    
  • 示例20

    获取按首字母筛选的分类项(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;
    }
    
  • 示例21

    获取按meta键值排序的分类项:

    $terms = get_terms(
        'taxonomy_name',
        array(
            'meta_key' => 'custom_meta_key',
            'orderby' => 'custom_meta_key'
        )
    );