
本文介绍两种可靠方式实现 gravity forms 表单字段的自动预填充:一是利用内置用户元字段合并标签(推荐、零代码),二是通过自定义钩子读取当前用户最新提交记录并动态填充(适用于需复用历史表单数据的场景)。
本文介绍两种可靠方式实现 gravity forms 表单字段的自动预填充:一是利用内置用户元字段合并标签(推荐、零代码),二是通过自定义钩子读取当前用户最新提交记录并动态填充(适用于需复用历史表单数据的场景)。
Gravity Forms 提供了灵活且强大的预填充机制,尤其适合重复性表单场景(如年度活动注册)。当用户每年填写同一张表单时,若能自动加载其上次提交的数据或用户资料,将显著提升体验与填写效率。以下是两种经过验证的实践方案:
✅ 方案一:使用 user: 合并标签(最简、推荐)
Gravity Forms 原生支持基于 WordPress 用户元数据(user meta)的合并标签,语法为 {user:meta_key}。该方式无需编写 PHP 代码,配置直观、稳定可靠,适用于姓名、邮箱、地址等已存储在用户档案中的信息。
操作步骤:
- 编辑目标表单 → 点击需预填充的字段(如「姓名」)→ 进入「高级」选项卡;
- 在「默认值」输入框中填入对应合并标签,例如:
- 姓名字段 →
{user:first_name} - 姓氏字段 →
{user:last_name} - 邮箱字段 →
{user:user_email} - 自定义用户字段(如
billing_postcode)→{user:billing_postcode}
- 姓名字段 →
✅ 优势:即配即用、兼容性强、无性能开销;
⚠️ 注意:仅适用于已保存在wp_usermeta表中的字段(包括 WooCommerce、Profile Builder 等插件扩展的用户字段),不适用于历史表单提交内容。
✅ 方案二:动态读取用户最新表单提交(精准复用历史数据)
若需预填充的是用户上一次提交该表单时填写的具体内容(例如“去年报名的公司名称”“参会人数”等非用户元字段),则需通过 gform_field_value_* 钩子动态查询。您提供的原始代码思路正确,但存在两处关键问题需修正:
-
rgars()是 Gravity Forms 旧版辅助函数(已弃用),应改用wp_list_pluck()或直接数组访问; -
$field->id是字段 ID,但GFAPI::get_entries()返回的条目结构中,字段值位于['field_id']键下(非嵌套路径),需用GFFormsModel::get_lead_field_value()安全提取。
优化后的完整代码示例:
add_filter( 'gform_field_value_latest_entry_value', 'populate_from_latest_entry', 10, 2 );
function populate_from_latest_entry( $value, $field ) {
// 仅对登录用户生效
if ( ! is_user_logged_in() ) {
return $value;
}
$user_id = get_current_user_id();
$form_id = $field->formId;
// 查询当前用户对该表单的最新一条提交(按创建时间倒序)
$entries = GFAPI::get_entries(
$form_id,
[
'status' => 'active',
'field_filters' => [
[
'key' => 'created_by',
'value' => $user_id,
],
],
],
[],
[ 'page_size' => 1, 'offset' => 0, 'sort' => 'date_created DESC' ]
);
if ( is_wp_error( $entries ) || empty( $entries ) ) {
return $value; // 无历史提交,返回空
}
$latest_entry = $entries[0];
// 安全获取指定字段的值(自动处理单选/多选/文件上传等复杂类型)
$field_value = GFFormsModel::get_lead_field_value( $latest_entry, $field->id );
return $field_value ?: $value;
}
启用方式:
- 在表单字段的「高级」设置中,将「默认值」设为
{latest_entry_value}(与gform_field_value_后缀一致); - 每个字段需单独配置该合并标签(如需预填充多个字段,全部设为
{latest_entry_value}即可)。
✅ 优势:精准复用用户真实历史提交,支持任意表单字段;
⚠️ 注意事项:
- 确保用户有且仅有一次提交(或明确业务逻辑取最新一条);
- 高并发场景建议添加缓存(如
wp_cache_set())避免频繁查询;- 若表单含条件逻辑或动态字段,需额外校验字段 ID 兼容性。
总结建议
-
优先使用
{user:xxx}:适用于用户资料类字段,开发零成本、维护零负担; -
选用
latest_entry_value钩子:适用于需继承历史表单上下文的业务(如续费、年度更新),需少量代码但控制力更强; - 避免混合使用:同一字段勿同时依赖用户元数据与历史提交,易引发逻辑冲突;
-
务必测试权限:确保
is_user_logged_in()校验及GFAPI::get_entries()的created_by过滤准确生效。
通过以上任一方案,即可让您的年度注册表单真正“记住用户”,兼顾简洁性与专业性。











