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

基于唯一密钥从已有条目动态填充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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:24:14