
本文详解如何让 wordpress 父分类页面自动聚合并展示其所有子分类下的已发布文章,并支持置顶文章优先排序,适用于多层分类结构的博客或内容站点。
本文详解如何让 wordpress 父分类页面自动聚合并展示其所有子分类下的已发布文章,并支持置顶文章优先排序,适用于多层分类结构的博客或内容站点。
在 WordPress 默认行为中,当访问一个父分类(如 Parent1)的归档页时,系统仅显示直接分配给该父分类的文章,而不会自动包含其子分类(如 Child Cat 1、Child Cat 2)中的内容。但实际业务中,我们常需实现“父分类页即子分类内容总览页”的效果——例如 Parent1 页面应展示其全部子分类下共 5 篇文章,并按置顶状态优先排序。
✅ 正确实现逻辑:利用 cat 参数的层级继承特性
WordPress 的 WP_Query(及 get_posts())中,'cat' => $parent_id 本身已支持向下递归匹配:只要传入父分类 ID,查询将自动包含该父分类及其所有后代子分类下的已发布文章(前提是这些文章未被其他条件排除)。这是最简洁、高效且符合 WordPress 原生设计的方式。
⚠️ 注意:
'cat'参数不接受数组,但支持单个整数 ID;而'category__in'虽支持数组,却不继承子分类关系,仅精确匹配指定 ID 列表中的分类——因此不能用于此场景。
✅ 推荐代码(在父分类模板如 category.php 或自定义查询中使用):
<?php // 获取当前分类对象(确保在分类归档页上下文中)
if (is_category()) {
$current_cat = get_queried_object();
$parent_id = $current_cat->term_id;
// 若当前是子分类,向上获取其直属父分类ID(可选:根据需求决定是否始终取顶层父级)
if ($current_cat->parent > 0) {
$parent_id = $current_cat->parent;
}
$args = array(
'posts_per_page' => 20,
'post_status' => 'publish',
'cat' => $parent_id, // 关键:传入父分类ID,自动包含所有子分类文章
'ignore_sticky_posts'=> false, // 默认为false,置顶文章自动置顶
'orderby' => 'date', // 配合 sticky,建议显式声明
'order' => 'DESC', // 新文章靠前,置顶优先
);
$myposts = get_posts($args);
if ($myposts) {
foreach ($myposts as $post) {
setup_postdata($post);
?>
<article><h3><a href="<?php%20the_permalink();%20?>"><?php the_title(); ?></a></h3>
<div><?php the_excerpt(); ?></div>
</article><?php }
wp_reset_postdata();
}
}
?>
? 关键说明与注意事项
-
cat => $id是核心:它触发 WordPress 内部的get_term_children()逻辑,自动构建完整子分类树并合并查询,无需手动遍历get_term_children()。 -
置顶文章天然支持:只要不设置
'ignore_sticky_posts' => true(默认即false),且主循环使用WP_Query或query_posts()(不推荐)等支持 sticky 机制的查询方式,置顶文章将自动排在最前面。 -
避免常见错误:
- ❌ 不要用
get_the_category($post->ID)在分类归档页获取当前分类——该函数仅在单篇文章上下文有效; - ❌ 不要对
$category[0]->parent做空判断后仍用子分类 ID 查询(这会回到原问题); - ✅ 正确做法:在
category.php中用get_queried_object()获取当前访问的分类,再判断其是否为子分类,决定是否上溯至父级。
- ❌ 不要用
? 进阶提示:支持多级父分类(如祖父级聚合)
若需 Parent1 下所有子孙(含孙分类)文章,上述 cat => $parent_id 依然有效——WordPress 默认递归至叶子节点。如需限制只到直接子级,可手动构造分类数组:
$children = get_terms([
'taxonomy' => 'category',
'child_of' => $parent_id,
'hide_empty' => false,
'fields' => 'ids',
]);
$category_ids = array_merge([$parent_id], $children);
$args['cat'] = implode(',', $category_ids); // 注意:此时必须用字符串拼接 + 'cat'
但绝大多数场景下,直接使用 'cat' => $parent_id 即可优雅、高效、可靠地实现父分类聚合子分类内容的需求。











