Gravity Forms跳转确认时gform_after_submission钩子未触发问题求助
Gravity Forms跳转感谢页后PHP变量无法传递到JS的问题解决
问题场景
在Gravity Forms中,表单确认方式设为消息时,提交后$this->categoryStats能正常填充并通过wp_localize_script传递给前端JS;但改为跳转至感谢页面后,该变量始终为空。相关简化代码如下:
<?php GFForms::include_addon_framework(); class GFSurveyReport extends GFAddOn { private static $_instance = null; private $categoryStats = []; public static function get_instance() { if ( self::$_instance == null ) { self::$_instance = new GFSurveyReport(); } return self::$_instance; } public function init() { parent::init(); add_action( 'gform_after_submission', array( $this, 'curate_form_answers'), 10, 2 ); // Enqueue scripts and styles add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts_and_styles' ) ); } public function enqueue_scripts_and_styles() { wp_enqueue_script( 'gf-survey-plugin-js', plugin_dir_url( __FILE__ ) . '../js/plugin.js', array( 'jquery' ), '1.0.0', true ); // Pass PHP variables to JavaScript wp_localize_script( 'gf-survey-plugin-js', 'categoryStats', $this->categoryStats ); } public function curate_form_answers($entry, $form){ $this->categoryStats = $categoryStats; } }
原因分析
- 钩子执行顺序问题:当表单设置为跳转感谢页时,
wp_enqueue_scripts在当前请求早期就已执行(输出脚本和本地化变量),而gform_after_submission是表单提交处理时才触发,此时本地化脚本已经发送到前端,修改后的$this->categoryStats无法同步过去。 - 代码语法错误:
curate_form_answers方法中直接使用未定义的$categoryStats变量,会导致赋值失败,即使钩子触发,$this->categoryStats也不会被正确填充。
解决方案
1. 修复变量未定义错误
先确保curate_form_answers中的$categoryStats是从表单提交数据中计算得到的,示例如下:
public function curate_form_answers($entry, $form){ // 根据entry和form数据生成统计结果,示例逻辑 $categoryStats = [ 'completed' => 1, 'category_counts' => [ 'A' => $entry['1'], // 假设字段ID1是分类A的结果 'B' => $entry['2'] // 字段ID2是分类B的结果 ] ]; $this->categoryStats = $categoryStats; }
2. 基于Session传递数据(适配跳转场景)
跳转感谢页属于新请求,原请求中的$this->categoryStats无法跨请求传递,因此需要用Session暂存数据:
步骤1:在表单提交时存储数据到Session
修改curate_form_answers方法,将统计数据存入Session:public function curate_form_answers($entry, $form){ // 计算统计数据 $categoryStats = [ // 你的统计逻辑 ]; // 启动会话 if (!session_id()) { session_start(); } // 存储数据到Session $_SESSION['gf_survey_category_stats'] = $categoryStats; $this->categoryStats = $categoryStats; }步骤2:在感谢页加载时读取Session并传递给JS
修改enqueue_scripts_and_styles方法,仅在感谢页加载时读取Session数据并本地化:public function enqueue_scripts_and_styles() { // 替换为你的感谢页判断逻辑(比如根据页面ID或slug) if (is_page(123)) { // 123是感谢页的ID wp_enqueue_script( 'gf-survey-plugin-js', plugin_dir_url( __FILE__ ) . '../js/plugin.js', array( 'jquery' ), '1.0.0', true ); // 读取Session数据 if (!session_id()) { session_start(); } $categoryStats = isset($_SESSION['gf_survey_category_stats']) ? $_SESSION['gf_survey_category_stats'] : []; // 传递后销毁Session,避免刷新重复显示 unset($_SESSION['gf_survey_category_stats']); wp_localize_script( 'gf-survey-plugin-js', 'categoryStats', $categoryStats ); } }
3. 验证钩子是否触发
若怀疑gform_after_submission未触发,可添加日志验证:
public function curate_form_answers($entry, $form){ // 写入日志到wp-content/debug.log(需开启WP_DEBUG) error_log('gform_after_submission已触发,Entry ID: ' . $entry['id']); // 其他逻辑 }
开启WordPress调试模式后,查看debug.log即可确认钩子是否执行。
内容的提问来源于stack exchange,提问作者Daniel Vickers
相关产品推荐
相关产品推荐

