如何输出WordPress中所有分类及其多层子分类的层级结构(含各层级分类下的文章标题)
如何输出WordPress中所有分类及其多层子分类的层级结构(含各层级分类下的文章标题)
嘿,我明白你的需求了——不仅要输出顶级分类下的文章,还要把所有嵌套的子分类、孙分类都按层级展示,每个分类下面还要列出对应的文章标题对吧?这时候用递归函数处理是最省心的,因为分类的层级可能不确定,递归能自动遍历所有嵌套层级。
直接上可复用的代码,你可以把这段代码放到主题的模板文件(比如category.php、page.php,或者自定义的短代码里):
<?php // 定义递归函数,处理分类及其子分类、关联文章 function display_category_hierarchy_with_posts( $category_id = 0 ) { // 配置分类查询参数:按名称升序排列,可根据需求调整 $category_args = array( 'parent' => $category_id, 'orderby' => 'name', 'order' => 'ASC', 'hide_empty' => false, // 设为true则只显示包含文章的分类,false显示所有分类 ); $categories = get_categories( $category_args ); foreach ( $categories as $category ) { // 计算当前分类的层级,生成缩进(用 实现,也可以用CSS样式替代) $level = substr_count( get_category_parents( $category->term_id, false, ',' ), ',' ) - 1; $indent = str_repeat( ' ', $level ); // 输出当前分类名称 echo $indent . '- ' . esc_html( $category->name ) . '<br>'; // 查询当前分类下的所有已发布文章,按标题升序排列 $post_args = array( 'cat' => $category->term_id, 'orderby' => 'title', 'order' => 'ASC', 'posts_per_page' => -1, // 显示该分类下全部文章 'post_status' => 'publish', ); $posts = get_posts( $post_args ); if ( ! empty( $posts ) ) { // 输出文章标题,层级比分类深一级 $post_indent = str_repeat( ' ', $level + 1 ); foreach ( $posts as $post ) { setup_postdata( $post ); echo $post_indent . ' - ' . esc_html( get_the_title() ) . '<br>'; } wp_reset_postdata(); // 重置文章数据,避免干扰后续查询 } // 递归调用,处理当前分类的子分类 display_category_hierarchy_with_posts( $category->term_id ); } } // 启动层级遍历,从顶级分类(parent=0)开始 display_category_hierarchy_with_posts(); ?>
关键细节说明:
- 层级缩进:用
get_category_parents计算分类的嵌套深度,配合str_repeat生成缩进,你也可以把 换成CSS类,通过padding-left来控制样式,这样更灵活; - 空分类控制:
hide_empty参数如果设为true,会自动过滤掉没有文章的分类; - 自定义分类法适配:如果要处理自定义分类法,只需在
$category_args里加上'taxonomy' => '你的自定义分类法Slug'即可; - 数据安全:用
esc_html转义输出内容,避免XSS风险,这是WordPress开发的好习惯哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

