如何从嵌入Gravity Form指定字段填充WooCommerce订单自定义字段
实现方案
核心逻辑:Gravity Forms Product Add-ons 会在用户加购时关联表单提交条目和购物车项目,下单完成后自动完成条目和订单的绑定,直接使用插件提供的专属钩子即可准确拿到表单数据,不需要额外做条目和订单的映射匹配。
前置参数确认
先把三个关键参数找对,避免代码运行出错:
- 目标表单ID:进入Gravity Forms表单列表,将鼠标悬浮在表单编辑链接上,从URL参数
id=xx中获取 - 待提取字段ID:进入目标表单编辑页,点击需要提取数据的字段,右侧配置面板顶部会显示该字段的数字ID
- 订单自定义字段元键(meta key):进入WooCommerce Admin Custom Order Fields的字段列表,找到你创建的目标字段,从配置项中获取对应的元键,该插件生成的元键格式一般为
wc_acof_xx
代码实现
使用Gravity Forms Product Add-ons专属钩子gform_woocommerce_post_create_order,该钩子触发时机为订单创建完成、表单条目和订单关联完成后,可以稳定拿到表单数据和订单ID。
不要使用通用的woocommerce_new_order或gform_after_submission钩子:前者触发时GF数据还未完成绑定拿不到值,后者触发时用户仅完成加购、订单还未生成,无法写入订单字段。
将以下代码插入当前主题的functions.php文件,或使用代码片段插件添加即可,不要直接修改插件核心文件:
add_action( 'gform_woocommerce_post_create_order', 'sync_gf_field_to_order_meta', 10, 3 ); function sync_gf_field_to_order_meta( $order_id, $entry, $form ) { // 替换为你的目标表单ID $target_form_id = 3; // 替换为你要提取的GF字段ID $target_field_id = 5; // 替换为你的订单自定义字段元键 $target_order_meta_key = 'wc_acof_2'; // 非目标表单直接终止,避免数据误写 if ( (int)$form['id'] !== $target_form_id ) { return; } // 从表单条目中读取目标字段值,rgar是Gravity Forms内置的安全读取数组值的函数 $field_value = rgar( $entry, $target_field_id ); // 字段值为空时不写入,避免覆盖已有有效数据 if ( empty( $field_value ) ) { return; } // sanitize处理后写入订单自定义字段,普通文本字段用sanitize_text_field即可 update_post_meta( $order_id, $target_order_meta_key, sanitize_text_field( $field_value ) ); }
验证与适配
- 代码添加完成后,在前台走完整购买流程,提交包含目标表单的商品订单
- 进入后台订单编辑页,检查目标自定义字段是否已经自动填充了表单中填写的对应值
- 如果未正常写入,优先检查三个配置的ID/元键是否正确,以及是否有服务器缓存导致新代码未生效
- 如果要提取的是多选、文件上传类特殊字段,替换代码中对应的sanitize函数即可:比如文件上传字段存储URL时用
esc_url_raw处理,多选字段存储数组时不需要转义字符串,直接传入处理好的数组值即可。
如果同一个商品页嵌入了多个不同的Gravity Form,只需要在代码中增加表单ID的判断分支,分别匹配对应字段和订单元键即可,不需要重复挂载钩子。
内容的提问来源于stack exchange,提问作者mitchkellyweb
相关产品推荐
相关产品推荐

