如何在WPForms的wpforms_process_complete钩子函数中统一获取多学校表单的必填公共字段
如何在WPForms的wpforms_process_complete钩子函数中统一获取多学校表单的必填公共字段
嘿,我完全懂你的场景——多个学校专属的WPForms表单,各自有自定义问题,但都共享几个必填公共字段和统一的隐藏字段,现在要在wpforms_process_complete钩子里高效提取这些公共字段对吧?给你两个实用的方案,优先推荐第一个,灵活性拉满:
方案一:通过统一的字段名称(推荐)
这个思路的核心是:给所有表单里的公共字段设置完全一致的“字段名称”(注意是WPForms后台字段设置里的「名称」属性,不是前端显示的标签),比如把所有学校表单里的“first name”字段名称都设为first_name,以此类推。这样不管字段在表单里的位置如何变化,我们都能精准匹配到。
直接上代码示例:
add_action( 'wpforms_process_complete', 'wpf_dev_process_complete', 10, 4 ); function wpf_dev_process_complete( $fields, $entry, $form_data, $entry_id ) { // 先定义我们需要提取的公共字段(键是后台设置的字段名称,值是字段的友好名称,方便调试) $required_common_fields = [ 'first_name' => '名字', 'last_name' => '姓氏', 'dob' => '出生日期', 'email' => '邮箱', 'phone_number' => '手机号', 'school_identifier' => '学校标识' // 你的隐藏字段名称 ]; $extracted_data = []; // 遍历表单所有字段,匹配公共字段 foreach ( $fields as $field ) { // 跳过没有设置名称的字段 if ( !isset( $field['name'] ) || !array_key_exists( $field['name'], $required_common_fields ) ) { continue; } // 根据字段类型处理取值逻辑 switch ( $field['type'] ) { case 'name': // 如果用的是WPForms自带的组合姓名字段,拆分出first和last $extracted_data['first_name'] = $field['value']['first'] ?? ''; $extracted_data['last_name'] = $field['value']['last'] ?? ''; break; case 'date': case 'email': case 'phone': case 'text': case 'hidden': // 这些类型直接取value即可 $extracted_data[ $field['name'] ] = $field['value'] ?? ''; break; default: // 其他特殊字段类型可以在这里扩展处理逻辑 $extracted_data[ $field['name'] ] = $field['value'] ?? ''; break; } } // 【可选】后端二次验证必填字段(虽然前端已经验证,但后端更稳妥) $missing_fields = []; foreach ( array_keys( $required_common_fields ) as $field_key ) { if ( empty( $extracted_data[ $field_key ] ) ) { $missing_fields[] = $required_common_fields[ $field_key ]; } } if ( !empty( $missing_fields ) ) { // 记录错误日志,或者做其他处理 error_log( '提交的表单缺失必填公共字段:' . implode( ', ', $missing_fields ) ); return; // 终止后续API调用逻辑 } // 现在$extracted_data里就是所有公共字段的值了,接下来可以直接用于API调用 // 示例:发起POST请求到外部系统 // $api_response = wp_remote_post( '你的目标API地址', [ // 'headers' => [ 'Content-Type' => 'application/json' ], // 'body' => json_encode( $extracted_data ), // 'timeout' => 15 // ]); // 【可选】验证API请求结果 // if ( is_wp_error( $api_response ) ) { // error_log( 'API调用失败:' . $api_response->get_error_message() ); // } }
这个方案的优势在于:哪怕以后调整某个学校表单的字段顺序,或者新增自定义问题,只要公共字段的名称不变,代码就不用修改,维护成本极低。
方案二:按字段位置提取(不推荐,仅作备选)
如果你的所有学校表单里,公共字段的位置是完全固定的(比如前5个字段就是那几个必填项),也可以按索引提取,但这种方式非常脆弱——只要某个表单调整了字段顺序,代码就会出错,所以只适合临时应急用:
add_action( 'wpforms_process_complete', 'wpf_dev_process_complete', 10, 4 ); function wpf_dev_process_complete( $fields, $entry, $form_data, $entry_id ) { // 假设前5个字段依次是first name、last name、dob、email、phone $extracted_data = [ 'first_name' => $fields[1]['value'] ?? '', // WPForms字段索引从1开始 'last_name' => $fields[2]['value'] ?? '', 'dob' => $fields[3]['value'] ?? '', 'email' => $fields[4]['value'] ?? '', 'phone_number' => $fields[5]['value'] ?? '' ]; // 后续API调用逻辑同上... }
小提醒
- 测试的时候可以用
error_log( print_r( $extracted_data, true ) )把提取到的数据打印到日志里,确认是否正确。 - 隐藏字段的取值逻辑和普通文本字段完全一致,只要名称统一就能轻松拿到。
备注:内容来源于stack exchange,提问作者Rakesh Kumar
相关产品推荐
相关产品推荐

