如何获取WordPress自定义文章类型各年度的发布数量数组?
WordPress 自定义文章类型按年统计发布数量实现方案
这里提供两种可直接落地的实现方式,按需选择即可:
方式1:直接数据库查询(性能最优,推荐)
直接通过$wpdb执行分组统计查询,不需要处理多余的渲染逻辑,返回的结果可以直接作为图表数据源:
function get_papers_yearly_count() { global $wpdb; // 直接按年分组统计已发布的papers类型文章 $raw_data = $wpdb->get_results( $wpdb->prepare( "SELECT YEAR(post_date) AS publish_year, COUNT(ID) AS post_count FROM {$wpdb->posts} WHERE post_type = %s AND post_status = 'publish' GROUP BY YEAR(post_date) ORDER BY publish_year DESC", 'papers' ), ARRAY_A ); // 转换为 [年份 => 发布数量] 格式的关联数组 $yearly_count = []; foreach ($raw_data as $item) { $yearly_count[$item['publish_year']] = (int)$item['post_count']; } return $yearly_count; }
调用get_papers_yearly_count()即可拿到你需要的数组,返回示例:[2024 => 13, 2023 => 9, 2022 => 6]
方式2:改造get_archives()实现(兼容原有逻辑)
如果你不想直接写SQL,也可以通过关闭get_archives()的输出,自行解析统计结果:
// 获取按年归档的原始数据,关闭自动输出 $yearly_archives = get_archives([ 'type' => 'yearly', 'post_type' => 'papers', 'echo' => false, 'format' => 'custom' ]); $yearly_count = []; // 正则匹配年份和对应发布数量 preg_match_all('/([0-9]{4}).*?\((\d+)\)/', $yearly_archives, $matches); if (!empty($matches[1]) && !empty($matches[2])) { foreach ($matches[1] as $index => $year) { $yearly_count[$year] = (int)$matches[2][$index]; } }
这种方式兼容性更高,但性能略低于直接SQL查询,更适合文章量不大的站点使用。
注意事项
- 如果需要统计草稿、待审等其他状态的文章,修改SQL中
post_status的过滤条件,或者给get_archives()添加对应的post_status参数即可 - 高访问量站点建议给查询结果加对象缓存,避免重复查询数据库
内容的提问来源于stack exchange,提问作者Daniel Leandro
相关产品推荐
相关产品推荐

