基于唯一密钥从已有条目动态填充Gravity Forms多页表单
基于Gravity Forms的录取生多页注册表单动态填充实现方案
嘿,我来帮你搞定这个需求!核心思路是利用Gravity Forms的内置API和钩子,通过用户输入的5位唯一密钥匹配入学申请表的条目,自动把已有信息填充到新的多页注册表单里。下面是具体的实操步骤:
1. 准备多页注册表单
首先在Gravity Forms后台新建一个多页表单:
- 第一页添加单行文本字段作为密钥输入框,提示用户输入入学申请时的5位唯一密钥
- 后续页面添加你需要的详细注册字段,同时别忘了加入需要从入学表同步的字段(姓名、邮箱、电话、地址等),字段类型要和入学表对应一致
2. 编写密钥验证与数据填充逻辑
我们需要用Gravity Forms的钩子和GFAPI来实现数据查询与填充,把下面的代码添加到你的主题functions.php文件,或者自定义插件里(推荐用自定义插件,避免主题更新丢失代码):
// 钩子:在表单渲染、验证、提交前触发数据填充 add_filter( 'gform_pre_render', 'populate_registration_form_via_key' ); add_filter( 'gform_pre_validation', 'populate_registration_form_via_key' ); add_filter( 'gform_pre_submission_filter', 'populate_registration_form_via_key' ); add_filter( 'gform_admin_pre_render', 'populate_registration_form_via_key' ); function populate_registration_form_via_key( $form ) { // 替换为你的入学申请表单ID $application_form_id = 1; // 替换为新注册表单中密钥输入字段的ID $key_input_field_id = 2; // 字段映射:新注册表单字段ID => 入学申请表对应字段ID $field_mapping = array( 3 => 1, // 注册表单姓名ID3 → 入学表姓名ID1 4 => 2, // 注册表单邮箱ID4 → 入学表邮箱ID2 5 => 3, // 注册表单电话ID5 → 入学表电话ID3 6 => 4 // 注册表单地址ID6 → 入学表地址ID4 ); // 替换为入学表中存储唯一密钥的隐藏字段ID $hidden_key_field_id = 5; // 获取用户输入的密钥 $submitted_key = rgpost( 'input_' . $key_input_field_id ); if ( ! empty( $submitted_key ) && strlen( $submitted_key ) === 5 ) { // 构建查询条件:匹配密钥且条目为激活状态 $search_criteria = array( 'status' => 'active', 'field_filters' => array( array( 'key' => $hidden_key_field_id, 'value' => $submitted_key, 'operator' => '=' ) ) ); // 查询入学申请表的匹配条目 $entries = GFAPI::get_entries( $application_form_id, $search_criteria ); if ( ! is_wp_error( $entries ) && count( $entries ) === 1 ) { $matched_entry = $entries[0]; // 遍历字段映射,填充新表单的对应字段 foreach ( $field_mapping as $reg_field_id => $app_field_id ) { foreach ( $form['fields'] as &$field ) { if ( $field->id == $reg_field_id ) { $field->defaultValue = rgar( $matched_entry, $app_field_id ); } } } } else { // 密钥无效时添加验证错误提示 add_filter( 'gform_validation_' . $form['id'], function( $validation_result ) use ( $key_input_field_id ) { $validation_result['form']['fields'][ $key_input_field_id ]->failed_validation = true; $validation_result['form']['fields'][ $key_input_field_id ]->validation_message = '无效的唯一密钥,请检查后重新输入'; return $validation_result; }); } } return $form; }
3. 优化用户体验(可选但推荐)
上面的代码是在用户提交第一页后填充字段,你可以添加AJAX实时验证与填充,让用户输入密钥后立刻看到已有信息,提升体验:
前端AJAX脚本
把下面的代码添加到主题的footer.php(或者用自定义脚本插件加载):
jQuery(document).ready(function($) { // 替换为密钥输入字段的选择器(格式:#input_表单ID_字段ID) $('#input_2_2').on('blur', function() { var inputKey = $(this).val(); if (inputKey.length === 5) { $.ajax({ url: ajaxurl, type: 'POST', data: { action: 'validate_gravity_key_and_populate', key: inputKey, app_form_id: 1, // 入学申请表单ID field_map: {3:1,4:2,5:3,6:4}, // 字段映射 hidden_key_id: 5 // 入学表隐藏密钥字段ID }, success: function(response) { if (response.success) { // 自动填充对应字段 $.each(response.data, function(fieldId, value) { $('#input_2_' + fieldId).val(value); }); } else { alert(response.data); } }, error: function() { alert('验证请求失败,请稍后重试'); } }); } }); });
后端AJAX处理函数
把下面的代码也添加到functions.php或自定义插件:
// AJAX验证密钥并返回填充数据 add_action('wp_ajax_validate_gravity_key_and_populate', 'validate_gravity_key_ajax_handler'); add_action('wp_ajax_nopriv_validate_gravity_key_and_populate', 'validate_gravity_key_ajax_handler'); function validate_gravity_key_ajax_handler() { $key = sanitize_text_field($_POST['key']); $app_form_id = intval($_POST['app_form_id']); $field_map = $_POST['field_map']; $hidden_key_id = intval($_POST['hidden_key_id']); $search_criteria = array( 'status' => 'active', 'field_filters' => array( array( 'key' => $hidden_key_id, 'value' => $key, 'operator' => '=' ) ) ); $entries = GFAPI::get_entries($app_form_id, $search_criteria); if (!is_wp_error($entries) && count($entries) === 1) { $matched_entry = $entries[0]; $fill_data = array(); foreach ($field_map as $reg_field_id => $app_field_id) { $fill_data[$reg_field_id] = rgar($matched_entry, $app_field_id); } wp_send_json_success($fill_data); } else { wp_send_json_error('无效的唯一密钥,请检查后重新输入'); } }
4. 额外优化:设置填充字段为只读
如果你不想让用户修改从入学表同步来的信息,可以把这些字段设置为只读:
add_filter( 'gform_field_content', 'make_sync_fields_readonly', 10, 5 ); function make_sync_fields_readonly( $content, $field, $value, $lead_id, $form_id ) { // 替换为需要设为只读的注册表单字段ID数组 $readonly_field_ids = array(3,4,5,6); if (in_array($field->id, $readonly_field_ids) && $form_id == 2) { // 替换为注册表单ID $content = str_replace( 'type="text"', 'type="text" readonly', $content ); // 针对其他字段类型(如邮箱、电话)调整替换规则 $content = str_replace( 'type="email"', 'type="email" readonly', $content ); $content = str_replace( 'type="tel"', 'type="tel" readonly', $content ); } return $content; }
5. 测试与调试
- 输入正确的5位密钥,检查对应字段是否自动填充
- 输入错误/不存在的密钥,确认错误提示正常显示
- 多页表单切换时,检查填充的字段值是否保留
- 提交表单后,验证新条目数据是否正确存储
内容的提问来源于stack exchange,提问作者noahkuhn
相关产品推荐
相关产品推荐

