这里有一个替代解决方案。以下函数接受一个参数数组,其中包含两个可能的键:
taxonomy
: 字符串。分类的名称level
: 一个int。0表示根元素,1表示根元素的子元素,依此类推
它返回
WP_Term
对象。
function wpse_259499_get_subterms( $args = array() ) {
$args = wp_parse_args( $args, array( \'taxonomy\' => \'category\', \'level\' => 0 ) );
$subterms = get_transient( \'taxonomy-subterms-\' . $args[\'taxonomy\'] . \'-\' . $args[\'level\'] );
$terms_ids = array();
if ( is_array( $subterms ) ) {
return $subterms;
}
if ( 0 == $args[\'level\'] ) {
$terms = get_terms( array(
\'taxonomy\' => $args[\'taxonomy\'],
\'get\' => \'all\',
\'orderby\' => \'id\',
\'fields\' => \'id=>parent\',
) );
foreach ( $terms as $term_id => $parent ) {
if ( ! $parent ) {
$terms_ids[] = $term_id;
}
}
} else if ( $hierarchy = _get_term_hierarchy( $args[\'taxonomy\'] ) ) {
$subterms_args = array( \'taxonomy\' => $args[\'taxonomy\'], \'level\' => $args[\'level\'] - 1 );
foreach ( wpse_259499_get_subterms( $subterms_args ) as $term ) {
if ( isset( $hierarchy[ $term->term_id ] ) ) {
$terms_ids = array_merge( $terms_ids, $hierarchy[ $term->term_id ] );
}
}
}
if ( $terms_ids ) {
$subterms = get_terms( array(
\'taxonomy\' => $args[\'taxonomy\'],
\'get\' => \'all\',
\'include\' => $terms_ids,
) );
} else {
$subterms = array();
}
set_transient( \'taxonomy-subterms-\' . $args[\'taxonomy\'] . \'-\' . $args[\'level\'], $subterms, HOUR_IN_SECONDS );
return $subterms;
}
Note 1: 如果您决定重命名该函数,请注意该函数正在调用自身,因此您还需要在递归调用中更改名称。
Note 2: 结果将在瞬态中存储一个小时。为了在开发过程中获得新的结果,可以在函数开头添加以下行:
delete_transient( \'taxonomy-subterms-\' . $args[\'taxonomy\'] . \'-\' . $args[\'level\'] );
如果您希望始终获得准确的结果,那么您可能还需要在每次添加、删除或修改感兴趣的分类中的类别时删除这些瞬态。
示例可以在模板中使用以下代码,以生成指向所选级别中所有术语的无序链接列表:
<ul>
<?php foreach ( wpse_259499_get_subterms( array( \'taxonomy\' => \'category\', \'level\' => 0 ) ) as $term ): ?>
<li><a href="<?php echo esc_attr( get_term_link( $term ) ); ?>"><?php echo esc_html( $term->name ); ?></a></li>
<?php endforeach; ?>
</ul>