请求指导创建含底层文章的三级自定义分类层级列表
实现自定义分类法三级层级术语列表(含底层术语文章)
我明白你想要的效果:自定义分类法下的三级术语层级,只有最底层的第三级术语才附带显示最多10篇关联文章,上层的一级、二级只展示术语本身。wp_list_categories确实没法直接实现这个需求,咱们用自定义递归函数来搞定,灵活性更高。
核心思路
- 先获取自定义分类法的所有顶级术语(父级为0的术语)
- 递归遍历每个术语,跟踪当前层级深度
- 当遍历到第三级(底层)术语时,查询其关联的最多10篇文章
- 输出嵌套的列表结构,方便你后续改成spoiler或accordion格式
完整代码实现
把下面的代码放到你的主题functions.php文件里,或者自定义插件中:
function custom_taxonomy_hierarchy_with_posts($taxonomy = 'your_custom_taxonomy', $parent_id = 0, $depth = 1) { // 获取当前父级下的所有子术语 $terms = get_terms(array( 'taxonomy' => $taxonomy, 'parent' => $parent_id, 'hide_empty' => false, // 如果要显示空术语,改成true则只显示有文章的 'orderby' => 'name', 'order' => 'ASC' )); if (!empty($terms)) { echo '<ul>'; foreach ($terms as $term) { echo '<li>' . esc_html($term->name); // 判断是否是第三级(底层)术语 if ($depth === 3) { // 查询该术语下最多10篇文章 $posts = get_posts(array( 'post_type' => 'your_post_type', // 替换成你的自定义文章类型或'post' 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'field' => 'term_id', 'terms' => $term->term_id ) ), 'posts_per_page' => 10, 'orderby' => 'date', 'order' => 'DESC' )); if (!empty($posts)) { echo '<ul class="term-posts">'; foreach ($posts as $post) { setup_postdata($post); echo '<li><a href="' . get_permalink($post->ID) . '">' . get_the_title($post->ID) . '</a></li>'; } wp_reset_postdata(); echo '</ul>'; } } else { // 不是底层术语,继续递归遍历子术语,深度+1 custom_taxonomy_hierarchy_with_posts($taxonomy, $term->term_id, $depth + 1); } echo '</li>'; } echo '</ul>'; } }
使用方法
在你需要显示这个层级的模板文件(比如archive.php、page.php)里,调用这个函数,替换成你的自定义分类法和文章类型:
// 替换成你的自定义分类法名称,比如'product_category' custom_taxonomy_hierarchy_with_posts('your_custom_taxonomy');
关键细节说明
- 层级判断:通过
$depth参数跟踪当前术语的层级,当$depth === 3时才显示文章,如果你需要调整层级(比如二级是底层),修改这个数值即可。 - 文章查询:
get_posts里的post_type要替换成你实际的文章类型,默认是'post'(普通文章)。 - 样式调整:输出的列表带有
term-posts类,你可以通过CSS自定义文章列表的样式,方便后续改成spoiler或accordion格式。 - 空术语处理:
hide_empty参数设为false会显示没有文章的术语,如果只想显示有文章的术语,改成true即可。
这样生成的嵌套列表结构,你可以很容易地用JavaScript或CSS把底层的文章列表改成spoiler(折叠面板)或者accordion格式啦。
内容的提问来源于stack exchange,提问作者jimmyahughes
相关产品推荐
相关产品推荐

