WordPress特定slug分类法求和:多同名奖牌分类计数实现方案
解决WordPress分类中同类型奖牌数量统计问题
方法一:通过WordPress内置函数遍历统计
你可以先获取目标分类法下的所有分类项,筛选出slug包含对应奖牌关键词的分类后,累加它们的关联运动员数量:
function count_medal_total($medal_slug_prefix) { $total = 0; // 替换成你的自定义分类法名称,比如'medals' $terms = get_terms(array( 'taxonomy' => 'medals', 'hide_empty' => false, // 统计所有分类,包括无关联文章的 )); foreach ($terms as $term) { // 检查slug是否以指定前缀开头(比如gold、silver、bronze) if (str_starts_with($term->slug, $medal_slug_prefix)) { $total += $term->count; } } return $total; } // 使用示例:统计所有金牌数量 $gold_total = count_medal_total('gold'); echo '金牌总数:' . $gold_total; // 统计银牌 $silver_total = count_medal_total('silver'); // 统计铜牌同理
如果你的PHP版本低于8.0,str_starts_with无法使用,替换成substr($term->slug, 0, strlen($medal_slug_prefix)) === $medal_slug_prefix即可。
方法二:直接数据库查询(效率更高)
如果分类数量较多,遍历所有分类会有性能损耗,直接用SQL查询更高效:
function count_medal_total_db($medal_slug_prefix) { global $wpdb; $taxonomy = 'medals'; // 替换为你的分类法名称 $prefix_length = strlen($medal_slug_prefix); $total = $wpdb->get_var($wpdb->prepare( "SELECT SUM(t.count) FROM {$wpdb->terms} t JOIN {$wpdb->term_taxonomy} tt ON t.term_id = tt.term_id WHERE tt.taxonomy = %s AND SUBSTRING(t.slug, 1, %d) = %s", $taxonomy, $prefix_length, $medal_slug_prefix )); return $total ? $total : 0; } // 使用示例 $gold_total = count_medal_total_db('gold');
优化建议:别再用重复分类了!
你现在创建gold-2、gold-3这类分类的做法并不合理,WordPress不允许重复分类名,但你可以用更优的方案:
- 分类元数据:给每个分类添加
medal_type元字段,标记是金牌、银牌还是铜牌,统计时直接按元字段筛选,无需依赖slug命名。 - 自定义字段:直接在运动员文章里添加
gold_medals、silver_medals、bronze_medals数字字段,统计时直接求和所有文章的对应字段值,比分类统计更灵活。 - 分类层级:创建父分类
金牌,将不同的金牌分类设为子分类,统计时直接求和父分类下所有子分类的数量。
内容的提问来源于stack exchange,提问作者Mikmik
相关产品推荐
相关产品推荐

