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

未登录场景下,WordPress后端与JetFormBuilder间表单提交变量的存储与访问方案咨询

未登录场景下,WordPress后端与JetFormBuilder间表单提交变量的存储与访问方案咨询

针对你遇到的未登录用户提交JetFormBuilder表单后,无法用user_meta存储和访问total、OTP、邮箱这类变量的问题,我给你几个实用的解决方案,结合WordPress和JetFormBuilder的特性来实现:


方案一:使用WordPress Transients API(推荐短期临时存储)

Transients是WordPress内置的临时存储机制,支持设置过期时间,非常适合这种未登录场景下的临时数据存储——毕竟用户没登录,数据通常不需要永久保留。具体步骤如下:

  1. 在你的calculate-total钩子函数里,生成一个唯一标识符(可以用用户提交的邮箱,或者随机生成一个token),把需要存储的变量打包成数组存到transient里。
  2. 把这个唯一标识符传递给前端:要么给当前表单添加隐藏字段,要么在表单提交后重定向到下一个表单时,把token作为URL参数带上。

代码示例:

add_action('jet-form-builder/custom-action/calculate-total', function ( $request ) {
    // 获取表单提交的邮箱(替换成你实际的字段名)
    $user_email = $request->get('email');
    // 生成随机token作为唯一标识(也可以用邮箱,只要确保唯一)
    $unique_token = wp_generate_password(16, false);

    // 打包需要存储的变量
    $form_data = array(
        'total' => 14500,
        'otp' => '123456', // 替换成你实际生成的OTP
        'email' => $user_email
    );

    // 存储transient,设置24小时过期(86400秒)
    set_transient('jet_form_submission_' . $unique_token, $form_data, 86400);

    // 选项A:把token放到当前表单的隐藏字段里(如果后续在同个表单里需要访问)
    add_filter('jet-form-builder/editor/field-value/your-hidden-field-slug', function() use ($unique_token) {
        return $unique_token;
    });

    // 选项B:跳转到第二个表单时,在URL里带上token参数
    wp_redirect(add_query_arg('submission_token', $unique_token, home_url('/second-form/')));
    exit;
});

后续表单访问数据的代码:

比如在第二个表单渲染前,读取URL里的token,再取出transient里的数据赋值给隐藏字段:

add_action('jet-form-builder/before-form-render', function() {
    if (isset($_GET['submission_token'])) {
        $token = sanitize_text_field($_GET['submission_token']);
        $form_data = get_transient('jet_form_submission_' . $token);
        
        if ($form_data) {
            // 把total赋值给名为total-hidden-field的隐藏字段
            add_filter('jet-form-builder/editor/field-value/total-hidden-field', function() use ($form_data) {
                return $form_data['total'];
            });
        }
    }
});

方案二:创建自定义数据库表(持久化存储)

如果需要长期保存这些提交数据(比如后续要做数据统计、回溯),可以创建一个自定义数据库表来存储。步骤如下:

  1. 先在主题的functions.php里添加创建表的代码,确保表在主题初始化时被创建(或检查是否存在)。
  2. 在calculate-total钩子里把数据插入到自定义表。
  3. 后续表单通过唯一标识查询表中的数据。

代码示例:

// 初始化时创建自定义表
add_action('init', 'jet_form_create_submission_table');
function jet_form_create_submission_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'jet_form_submissions';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        submission_token varchar(64) NOT NULL,
        total int(11) NOT NULL,
        otp varchar(20) NOT NULL,
        email varchar(100) NOT NULL,
        created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        PRIMARY KEY  (id),
        UNIQUE KEY submission_token (submission_token)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}

// 在calculate-total钩子里插入数据到自定义表
add_action('jet-form-builder/custom-action/calculate-total', function ( $request ) {
    global $wpdb;
    $unique_token = wp_generate_password(16, false);
    $user_email = $request->get('email');
    $total = 14500;
    $otp = '123456'; // 替换成实际生成的OTP

    $table_name = $wpdb->prefix . 'jet_form_submissions';
    $wpdb->insert(
        $table_name,
        array(
            'submission_token' => $unique_token,
            'total' => $total,
            'otp' => $otp,
            'email' => $user_email
        ),
        array('%s', '%d', '%s', '%s')
    );

    // 重定向到第二个表单,带上token参数
    wp_redirect(add_query_arg('submission_token', $unique_token, home_url('/second-form/')));
    exit;
});

// 在第二个表单里查询自定义表的数据
add_action('jet-form-builder/before-form-render', function() {
    if (isset($_GET['submission_token'])) {
        global $wpdb;
        $token = sanitize_text_field($_GET['submission_token']);
        $table_name = $wpdb->prefix . 'jet_form_submissions';
        
        $form_data = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE submission_token = %s", $token));
        
        if ($form_data) {
            // 把total赋值给隐藏字段
            add_filter('jet-form-builder/editor/field-value/total-hidden-field', function() use ($form_data) {
                return $form_data->total;
            });
        }
    }
});

方案三:利用PHP Session存储(简单直接)

WordPress默认没开启Session,所以需要先手动开启,之后就可以把数据存在Session里,后续表单直接读取Session变量即可。这种方式适合简单的单会话场景(用户关闭浏览器后数据就消失)。

代码示例:

// 开启Session(放在主题functions.php的开头位置)
add_action('init', 'jet_form_start_session');
function jet_form_start_session() {
    if (!session_id()) {
        session_start();
    }
}

// 在calculate-total钩子里把数据存到Session
add_action('jet-form-builder/custom-action/calculate-total', function ( $request ) {
    $_SESSION['jet_form_submission'] = array(
        'total' => 14500,
        'otp' => '123456',
        'email' => $request->get('email')
    );

    // 重定向到第二个表单
    wp_redirect(home_url('/second-form/'));
    exit;
});

// 在第二个表单里读取Session数据
add_action('jet-form-builder/before-form-render', function() {
    if (isset($_SESSION['jet_form_submission'])) {
        $form_data = $_SESSION['jet_form_submission'];
        
        // 把total赋值给隐藏字段
        add_filter('jet-form-builder/editor/field-value/total-hidden-field', function() use ($form_data) {
            return $form_data['total'];
        });

        // 可选:用完后销毁Session,避免用户重复使用数据
        // unset($_SESSION['jet_form_submission']);
    }
});

备注:内容来源于stack exchange,提问作者Varun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:53:00