WordPress多分类术语拼接 末尾加and及空分类报错解决
WordPress 多分类术语拼接问题修复
问题根源
- 原有
get_the_term_list()直接返回拼接完成的HTML字符串,不同分类的术语拼接时没有分隔符,会出现人名粘连的问题 - 用
get_the_terms()获取术语数组的思路是正确的,但该函数在分类无绑定术语、查询失败时会返回false而非空数组,直接传入array_merge()就会触发参数类型报错,后续遍历逻辑也会随之失效
可直接使用的实现代码
// 分别获取三个分类的术语,做容错处理,非数组结果统一转为空数组 $taxcomposer = get_the_terms( get_the_ID(), 'composer' ); $taxcomposer = is_array($taxcomposer) ? $taxcomposer : []; $taxarr = get_the_terms( get_the_ID(), 'arranger' ); $taxarr = is_array($taxarr) ? $taxarr : []; $taxlyrics = get_the_terms( get_the_ID(), 'lyrics' ); $taxlyrics = is_array($taxlyrics) ? $taxlyrics : []; // 合并所有术语数组 $all_terms = array_merge( $taxcomposer, $taxarr, $taxlyrics ); $term_links = []; if ( !empty($all_terms) ) { foreach ($all_terms as $term) { // 生成带样式的术语链接,通过CSS实现大写,避免转义问题 $term_url = get_term_link( $term ); if ( !is_wp_error($term_url) ) { $term_links[] = '<a style="text-transform: uppercase;" href="'.esc_url( $term_url ).'">'.$term->name.'</a>'; } } } $credits_string = ''; $link_count = count($term_links); if ( $link_count === 1 ) { $credits_string = $term_links[0]; } elseif ( $link_count === 2 ) { $credits_string = $term_links[0] . ' and ' . $term_links[1]; } elseif ( $link_count > 2 ) { $last_item = array_pop($term_links); // 不需要牛津逗号就把下面的', and '改成' and ',即可完全匹配你给出的预期效果 $credits_string = implode(', ', $term_links) . ' and ' . $last_item; } // 最终输出内容 $frontpage = ' <p style="padding-top: 9pt;text-align: center;">by</p> <p style="padding-top: 1pt;text-align: center;">'.$credits_string.'</p>';
逻辑说明
- 所有
get_the_terms()返回值都做了类型校验,即使某个分类下完全没有术语,也不会触发类型报错 - 额外判断了
get_term_link()的返回值,避免无效术语导致的链接错误 - 拼接逻辑适配不同数量的术语场景:
- 1个术语:直接输出
- 2个术语:中间用
and连接,不加多余逗号 - 3个及以上术语:前面项用逗号分隔,最后一项前加
and,符合常规排版规则
- 保留原有样式设置,大写效果通过CSS实现,比PHP层直接转字符串更灵活,也不会出现特殊字符转义问题
- 彻底解决不同分类术语拼接时无分隔符、人名粘连的问题
内容的提问来源于stack exchange,提问作者Pontus Eriksson
相关产品推荐
相关产品推荐

