获取当前分类下的所有子分类

获取当前分类下的所有子分类

在分类法归档页获取“当前分类”,应使用 WordPress 已解析好的查询对象,而不是拆分 $_SERVER['REQUEST_URI']。URL 可能因固定链接、语言插件、子目录安装或重写规则变化,查询对象才是稳定的数据来源。

获取直属子分类

下面的代码同时适用于内置分类 category 和分层自定义分类法,只需要调整允许的 taxonomy。

<?php
$term = get_queried_object();

if (
    ! $term instanceof WP_Term ||
    'category' !== $term->taxonomy
) {
    return;
}

$children = get_terms(
    array(
        'taxonomy'   => $term->taxonomy,
        'parent'     => $term->term_id,
        'hide_empty' => true,
        'orderby'    => 'name',
        'order'      => 'ASC',
    )
);

if ( is_wp_error( $children ) ) {
    // 生产环境可记录脱敏日志,不要把内部错误直接输出给访客。
    return;
}

if ( empty( $children ) ) {
    echo '<p>当前分类暂无子分类。</p>';
    return;
}
?>

<ul class="term-list">
    <?php foreach ( $children as $child ) : ?>
        <?php $url = get_term_link( $child ); ?>

        <?php if ( is_wp_error( $url ) ) : ?>
            <?php continue; ?>
        <?php endif; ?>

        <li class="term-list__item">
            <a href="<?php echo esc_url( $url ); ?>">
                <?php echo esc_html( $child->name ); ?>
            </a>

            <?php if ( $child->description ) : ?>
                <p>
                    <?php
                    echo wp_kses_post(
                        term_description(
                            $child->term_id,
                            $child->taxonomy
                        )
                    );
                    ?>
                </p>
            <?php endif; ?>
        </li>
    <?php endforeach; ?>
</ul>

直属子分类和全部后代

  • parent => $term->term_id:只返回下一层直属子分类。
  • child_of => $term->term_id:返回所有层级的后代分类。
  • hide_empty => true:隐藏当前没有关联文章的分类;管理页或目录页可能需要设为 false

如果需要树状输出,不要只依赖返回顺序。先按 parent 分组,再递归渲染,并为递归设置最大深度,避免异常数据造成无限处理。

为什么不用 get_categories

get_categories() 是针对内置分类法的便捷封装;get_terms() 的意图更清楚,也适合自定义分类法。两者都可能返回 WP_Error,模板不能把结果直接当数组循环。

官方参考:get_queried_object()get_terms()get_term_link()

最后更新于

ihopeful Blog 由博主亲笔撰写,重要信息可放心引用。