WordPress taxonomy.php页面如何统计近7天各子术语关联的文章数
分类法归档页面近7天发文数统计实现
核心说明
$term->count 是WordPress核心维护的全量关联文章计数,存储了对应术语下所有公开文章的总数量,没有内置参数可以直接将其过滤为「仅近7天发布」的统计值。强行通过全局钩子修改这个全局计数,会影响站点所有调用术语计数的场景,带来不可控的兼容风险,正确的实现方式是针对每个子术语单独发起带筛选条件的查询,获取匹配的文章数量。
具体实现
替换原代码中直接输出$term->count的逻辑,同时修复原代码嵌套循环时变量覆盖的问题,完整可运行的代码如下:
$taxonomy = get_query_var('taxonomy'); // 计算近7天的时间起点 $seven_days_ago = strtotime('-7 days'); // 获取当前分类法下的顶级主术语 $terms = get_terms( $taxonomy, array( 'orderby' => 'name', 'hide_empty' => false // 即使没有近期文章也展示对应子术语,可根据需求调整 ) ); // 遍历展示主术语 foreach ( $terms as $main_term ) { echo '<h2 class="text-center">' . esc_html( $main_term->name ) . '</h2>'; // 获取当前主术语下的所有子术语ID $child_term_ids = get_term_children( $main_term->term_id, $taxonomy ); echo '<ul class="lesson-categories">'; // 遍历所有子术语 foreach ( $child_term_ids as $child_term_id ) { $child_term_obj = get_term_by( 'id', $child_term_id, $taxonomy ); echo '<li>'; echo esc_html( $child_term_obj->name ); // 计算当前子术语下近7天的发布文章数 $recent_posts = new WP_Query( [ 'post_type' => 'post', // 按需替换为你实际使用的文章类型 'post_status' => 'publish', 'posts_per_page' => -1, 'fields' => 'ids', // 仅返回文章ID,降低内存占用 'date_query' => [ [ 'after' => date('Y-m-d', $seven_days_ago), 'column' => 'post_date' ] ], 'tax_query' => [ [ 'taxonomy' => $taxonomy, 'field' => 'term_id', 'terms' => $child_term_id, 'include_children' => false // 不递归把子层级的文章算进当前计数 ] ] ] ); // 输出近7天的新增文章数 echo ' <span>(近7天新增:' . (int)$recent_posts->found_posts . ')</span>'; echo '</li>'; } echo '</ul>'; }
优化建议
- 如果站点流量较高,可将每个子术语的近7天计数存入对象缓存,设置1小时左右的过期时间,避免每次页面加载都重复执行多轮数据库查询,拖慢页面响应速度
include_children参数可根据业务需求调整:如果希望子术语关联的文章数递归计入父层级统计,可将该值修改为true- 代码中增加了基础的输出转义,避免特殊字符引发的安全问题
内容的提问来源于stack exchange,提问作者george
相关产品推荐
相关产品推荐

