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
相关产品推荐
相关产品推荐

