基于用户邮箱域名自动更新ACF字段的技术实现求助
修正ACF用户关联字段自动赋值代码的方案
原代码存在的核心问题
get_field('user_company')未指定用户ID,ACF默认会读取当前文章字段,而非用户元数据- 变量名冲突:
list($user, $domain)中的$user与上方get_user_by获取的用户对象重名 update_field第三个参数错误:用户字段需传入用户ID标识,而非未定义的$post_title- ACF关联字段存储的是文章ID而非标题,直接传入字符串无法正确关联公司文章
- 未处理公司文章不存在的边界情况
修正后的代码
function update_user_company( $user_id, $args ) { // 拆分邮箱获取域名,避免变量名冲突 list($local_part, $domain) = explode('@', $args['user_email']); // 定义域名与公司名称的映射关系,便于后续扩展 $domain_company_map = [ 'gmail.com' => 'Google', 'amyling.com' => 'Pearlsin Arts' ]; // 无匹配域名则直接终止操作 if (!isset($domain_company_map[$domain])) { return; } $company_name = $domain_company_map[$domain]; // 查询对应名称的Companies自定义文章ID $company_query = new WP_Query([ 'post_type' => 'Companies', 'post_title' => $company_name, 'posts_per_page' => 1, 'post_status' => 'publish', 'no_found_rows' => true, // 优化查询性能,无需返回总条数 'fields' => 'ids' // 仅返回文章ID,减少数据加载 ]); // 找到对应公司文章后更新ACF字段 if ($company_query->have_posts()) { $company_id = $company_query->posts[0]; // 第三个参数传入'user_' + 用户ID,明确告知ACF操作的是用户元数据 update_field('user_company', $company_id, 'user_' . $user_id); } } add_action( 'user_register', 'update_user_company', 10, 2 );
关键改动说明
- 变量名优化:将拆分邮箱的局部变量改为
$local_part,避免与用户对象变量冲突 - 映射关系结构化:用数组存储域名与公司名称的对应规则,后续新增域名只需修改数组即可
- 正确获取关联ID:通过
WP_Query查询指定名称的Companies文章,确保获取到ACF关联字段所需的文章ID - 明确ACF操作对象:
update_field第三个参数使用'user_' . $user_id,明确指定操作的是用户元数据而非文章字段 - 边界情况处理:增加域名匹配判断和文章存在性检查,避免无效操作导致的错误
内容的提问来源于stack exchange,提问作者Amy Ling
相关产品推荐
相关产品推荐

