未登录场景下,WordPress后端与JetFormBuilder间表单提交变量的存储与访问方案咨询
未登录场景下,WordPress后端与JetFormBuilder间表单提交变量的存储与访问方案咨询
针对你遇到的未登录用户提交JetFormBuilder表单后,无法用user_meta存储和访问total、OTP、邮箱这类变量的问题,我给你几个实用的解决方案,结合WordPress和JetFormBuilder的特性来实现:
方案一:使用WordPress Transients API(推荐短期临时存储)
Transients是WordPress内置的临时存储机制,支持设置过期时间,非常适合这种未登录场景下的临时数据存储——毕竟用户没登录,数据通常不需要永久保留。具体步骤如下:
- 在你的
calculate-total钩子函数里,生成一个唯一标识符(可以用用户提交的邮箱,或者随机生成一个token),把需要存储的变量打包成数组存到transient里。 - 把这个唯一标识符传递给前端:要么给当前表单添加隐藏字段,要么在表单提交后重定向到下一个表单时,把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']; }); } } });
方案二:创建自定义数据库表(持久化存储)
如果需要长期保存这些提交数据(比如后续要做数据统计、回溯),可以创建一个自定义数据库表来存储。步骤如下:
- 先在主题的
functions.php里添加创建表的代码,确保表在主题初始化时被创建(或检查是否存在)。 - 在
calculate-total钩子里把数据插入到自定义表。 - 后续表单通过唯一标识查询表中的数据。
代码示例:
// 初始化时创建自定义表 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
相关产品推荐
相关产品推荐

