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

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;
    }
}

原因分析

  1. 钩子执行顺序问题:当表单设置为跳转感谢页时,wp_enqueue_scripts在当前请求早期就已执行(输出脚本和本地化变量),而gform_after_submission是表单提交处理时才触发,此时本地化脚本已经发送到前端,修改后的$this->categoryStats无法同步过去。
  2. 代码语法错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:22:07