WordPress中如何去除while循环获取的关联自定义文章类型数组重复内容
解决ACF关联字段获取重复学校的问题
我明白你的困扰——在循环课程时,关联的学校因为多个课程关联同一所学校而重复出现,而且array_unique()没法解决这个问题,这是因为它对WP_Post对象的处理方式不对。
问题根源
array_unique() 默认会把元素转换成字符串来比较是否重复,但WP_Post对象转成字符串后只会显示类似WP_Post Object的文本,无法区分不同ID的学校;哪怕是同一所学校的不同对象实例,也可能被它当成不同元素,所以去重失效。
解决方案:用学校ID作为数组键实现精准去重
最可靠的方式是利用学校ID的唯一性,把学校对象以ID为键存入数组,这样重复的ID会自动覆盖,自然实现去重。修改你的代码如下:
<?php // 初始化空数组存储去重后的学校 $unique_schools = []; while (have_posts()) : the_post(); // 获取当前课程关联的学校列表 $school_items = get_field('shkola'); // 先判断是否有关联学校,避免空数组报错 if ($school_items) { foreach ($school_items as $school_item) { // 用学校ID作为数组键,重复ID会自动覆盖 $unique_schools[$school_item->ID] = $school_item; } } endwhile; // 可选:重置数组索引,把关联数组转为连续数字索引的数组 $unique_schools = array_values($unique_schools); // 输出去重后的结果 foreach ($unique_schools as $school) { echo '<pre>'; print_r($school); echo '</pre>'; } ?>
代码说明
- 初始化数组:
$unique_schools用来存储最终去重的学校对象 - 循环课程收集学校:每获取一个课程的关联学校,就把学校对象以ID为键存入数组,相同ID的学校会被自动覆盖,不会重复
- 重置索引(可选):如果需要数组是连续的数字索引,用
array_values()把关联数组转为普通数组 - 输出结果:遍历去重后的数组,就能得到每个学校只出现一次的结果
这个方法比用array_unique()更精准,也不需要额外的字符串转换或比较逻辑,完全基于唯一的学校ID来处理,适配ACF返回的WP_Post对象场景。
内容的提问来源于stack exchange,提问作者Sergey Pervushin
相关产品推荐
相关产品推荐

