You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:42:33