在分类法归档页获取“当前分类”,应使用 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,模板不能把结果直接当数组循环。