WordPress foreach循环中如何去除重复的岗位帖子
重复渲染的核心原因
- 原代码把完整的岗位卡片输出逻辑直接嵌套在分类遍历的循环块内:每遍历到一个父级ID为95的关联分类,就会触发一次完整的岗位卡片输出。
- 当单个岗位绑定了2个及以上父级为95的城市分类时,循环会多次命中判断分支,最终把同一个岗位重复渲染多次。
- 内层用来筛选展示城市名称的遍历逻辑本身逻辑通顺,问题完全出在外层卡片的输出层级放错了位置。
修正后的可直接使用代码
<?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?> <?php // 获取当前岗位的所有关联位置分类,做异常拦截 $termsCo = get_the_terms( $post->ID, 'position-location' ); if ( is_wp_error( $termsCo ) || empty( $termsCo ) ) { continue; } // 轻量判断是否存在符合展示要求的关联分类 $hasValidLocation = false; foreach ( $termsCo as $termCo ) : if ( $termCo->parent === 95 ) { $hasValidLocation = true; break; // 命中一次即可停止遍历,减少性能消耗 } endforeach; // 确认符合展示条件后,仅输出一次岗位卡片 if ( $hasValidLocation ) : ?> <a class="ui grid segment" href="<?php echo get_permalink(); ?>"> <div class="twelve wide column"> <?php the_title(); ?> </div> <div class="four wide column"> <?php // 卡片内部再遍历全部分类,筛选需要展示的城市名称 foreach ( $termsCo as $location ) : if ( $location->name === 'Fort Collins' || $location->name === "Western Colorado" ) : ?> <span class="comma"><?php echo esc_html( $location->name ); ?></span> <?php endif; ?> <?php endforeach; ?> </div> </a> <?php endif; endwhile; wp_reset_postdata(); ?> <?php else : ?> <?php get_template_part( 'content', 'none' ); ?> <?php endif; ?>
优化说明
- 拆分遍历逻辑与输出逻辑:先通过一次轻量遍历判断岗位是否符合展示要求,只要满足条件就输出一次岗位卡片,完全脱离循环嵌套结构,从根源上杜绝重复渲染。
- 补充边界判断:对
get_the_terms可能返回的错误、空值情况做拦截,避免无关联分类的岗位触发PHP警告。 - 移除冗余调用:删掉内层循环中多余的
wp_reset_postdata()——当前逻辑没有执行自定义查询、没有修改全局$post对象,不需要重置文章上下文,冗余调用反而可能引发逻辑错乱。 - 增加安全处理:给输出的城市名称加上
esc_html()转义,符合内容输出的安全规范。 - 优化性能:判断有效分类时,命中一次符合条件的项就直接终止遍历,减少不必要的循环消耗。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

