ACF多选用户字段提取全部邮箱逗号分隔更新字段问题
问题根因
update_field调用放在了foreach循环内部,每次循环都会覆盖目标字段的已有值,最终只会留下最后一次遍历到的用户邮箱- PHP数组取值语法错误,
$user['user_email', ', ']是非法写法,PHP不支持在数组下标位置传入多个参数 - 没有做邮箱收集、拼接的前置逻辑,也没有兼容ACF字段不同返回格式、空值的边界场景
修复后可直接使用的代码
// 设置优先级为20,确保ACF完成自身字段存储逻辑后再读取值,避免拿到旧数据 add_action('acf/save_post', 'my_acf_save_post', 20); function my_acf_save_post($post_id){ $users = get_field('architect', $post_id); $collected_emails = []; // 字段无选中用户时直接清空目标字段,避免后续报错 if(empty($users)){ update_field('architect_notification', '', $post_id); return; } // 兼容字段被改为单选模式时返回非数组格式的场景,统一转为数组处理 if(!is_array($users)){ $users = [$users]; } foreach($users as $user){ // 兼容ACF用户字段三种返回格式:数组格式、WP_User对象格式、用户ID格式 if(is_array($user) && !empty($user['user_email'])){ $collected_emails[] = $user['user_email']; }elseif(is_object($user) && property_exists($user, 'user_email')){ $collected_emails[] = $user->user_email; }elseif(is_numeric($user)){ $user_obj = get_user_by('ID', $user); if($user_obj){ $collected_emails[] = $user_obj->user_email; } } } // 将收集到的邮箱用逗号拼接为字符串,写入目标字段 $final_email_str = implode(', ', $collected_emails); update_field('architect_notification', $final_email_str, $post_id); }
关键调整说明
- 循环内仅做邮箱收集操作,字段更新逻辑移到循环外部,从根本上解决值被覆盖的问题
- 新增空值、非数组返回的边界判断,避免字段无值、配置变更时出现PHP报错
- 同时兼容ACF用户字段的数组、WP_User对象、用户ID三种返回类型,不受后台字段返回格式配置限制
- 使用PHP内置
implode()函数做字符串拼接,直接生成符合要求的逗号分隔邮箱列表 - 给
acf/save_post钩子设置20的优先级,避免读取到未保存的旧字段值 - 修正了原代码中全角引号的语法错误
内容的提问来源于stack exchange,提问作者Webbb
相关产品推荐
相关产品推荐

