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

PHP:如何访问WordPress中add_action()创建的Elementor表单处理变量

问题根因

WordPress 的 Action 钩子设计上就不会将回调函数的返回值向外传递,你在回调内写return $fields自然不会生效。同时elementor_pro/forms/new_record是表单提交触发的钩子,执行时机晚于functions.php文件的初始化加载阶段,直接定义普通变量也无法被外部提前加载的代码捕获。
你之前尝试直接替换add_action为add_filter不生效,是因为Filter钩子需要有对应位置主动调用apply_filters()来接收返回值,没有对应的调用逻辑的话,Filter的返回值同样不会被主动传递到外部。

可行解决方案

方案1:用全局/静态变量存储(同请求内其他逻辑调用)

如果你需要在同一次表单提交请求的其他钩子回调中使用这些数据,可以用全局变量存储,示例代码如下:

// 先在回调外部定义全局存储变量
$GLOBALS['my_elementor_form_data'] = [];

add_action( 'elementor_pro/forms/new_record', function( $record ) {
    $form_name = $record->get_form_settings( 'form_name' );
    if ( 'MyElementorForm' !== $form_name ) {
        return;
    }

    $raw_fields = $record->get( 'fields' );
    $fields = [];
    foreach ( $raw_fields as $id => $field ) {
        $fields[ $id ] = $field['value'];
    }
    // 把处理好的字段存入全局变量
    $GLOBALS['my_elementor_form_data'] = $fields;

    $letter_type = $fields['LetterType'];
    // 原有邮件逻辑不变
    if($letter_type === "1"){
        $message = "Upload";
    } elseif($letter_type === "0"){
        $message = "PDF";
    } else {
        $message = "Fail " . gettype($letter_type) . " " . $letter_type;
    }

    mail(
        "my@email_address.com",
        "Test",
        "Test Message " . $message
    );
}, 10, 1 );

// 外部其他位置调用示例:需要保证执行时机晚于上面的action钩子,比如用优先级更低的钩子
add_action('init', function() {
    if (!empty($GLOBALS['my_elementor_form_data'])) {
        // 这里就可以拿到表单数据做后续处理
        $letter_type = $GLOBALS['my_elementor_form_data']['LetterType'] ?? '';
        // 你的其他逻辑
    }
}, 20); // 优先级20高于上面的10,保证后执行

方案2:用Session存储(跨请求/页面跳转后调用)

如果你需要在表单提交后跳转的页面里使用这些数据,可以存在Session中:

// 初始化Session(如果主题没开的话)
add_action('init', function() {
    if (!session_id()) {
        session_start();
    }
}, 1);

add_action( 'elementor_pro/forms/new_record', function( $record ) {
    // 原有表单处理逻辑不变,处理得到$fields后
    $_SESSION['my_elementor_form_data'] = $fields;
    // 其他原有逻辑不变
}, 10, 1 );

// 跳转后页面的逻辑调用
if (!empty($_SESSION['my_elementor_form_data'])) {
    $fields = $_SESSION['my_elementor_form_data'];
    // 处理完可以清空避免重复使用
    unset($_SESSION['my_elementor_form_data']);
}

内容的提问来源于stack exchange,提问作者Steve40

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:54:02