如何在PHP foreach循环中去除WordPress分类重复项?
解决WordPress按标签筛选分类时重复输出的问题
你的问题出在内层文章循环里重复输出同一分类——只要某个分类下有多篇符合标签条件的文章,就会跟着循环输出多少次分类链接。之前用array_unique没生效,是因为你没把分类信息先收集到数组里去重,而是直接在文章遍历里输出,逻辑没对上。下面给你两种靠谱的解决办法:
方案1:判断分类下有符合条件的文章就输出一次
不用遍历文章,只要确认分类里存在带指定标签的文章,就输出一次分类链接,同时用数组记录已输出的分类,彻底避免重复:
<?php // 用来记录已经输出过的分类ID,防止重复 $output_cats = []; // 获取目标父分类下的所有子分类 $terms = get_terms( array( 'taxonomy' => 'category', 'hide_empty' => 0, 'parent' => $catparid, ) ); foreach($terms as $term) { // 跳过已经输出过的分类 if (in_array($term->term_id, $output_cats)) continue; // 只查询1篇文章,用来判断该分类是否有符合标签的内容,减少查询压力 $args = array( 'category_name' => $term->name, 'tax_query' => array( array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => $cattagfilter ) ), 'posts_per_page' => 1, 'no_found_rows' => true, // 优化查询,不需要统计总条数 ); $posts_query = new WP_Query($args); // 只要有符合条件的文章,就输出分类链接并标记为已输出 if ($posts_query->have_posts()) { // 用esc_attr和esc_html做安全转义,避免XSS风险 echo '<p><a href="/category/case-stuides/' . esc_attr($term->slug) . '">' . esc_html($term->name) . '</a></p>'; $output_cats[] = $term->term_id; } wp_reset_postdata(); } ?>
方案2:直接查询符合条件的分类(更高效)
上面是先查所有分类再逐个验证,更高效的方式是让WordPress直接在数据库层面筛选出包含指定标签文章的分类,一步到位:
<?php // 直接获取父分类下、包含指定标签文章的所有分类 $terms = get_terms( array( 'taxonomy' => 'category', 'hide_empty' => 0, 'parent' => $catparid, 'tax_query' => array( array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => $cattagfilter, 'operator' => 'IN' ) ) ) ); // 遍历输出分类即可,不会有重复 foreach($terms as $term) { echo '<p><a href="/category/case-stuides/' . esc_attr($term->slug) . '">' . esc_html($term->name) . '</a></p>'; } ?>
注意事项:
- 方案2需要WordPress 3.1及以上版本支持跨分类法的
tax_query,如果你的版本太老,建议用方案1 - 代码里加入了
esc_attr()和esc_html()转义,这是WordPress开发的安全规范,避免出现XSS漏洞
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

