WpForms:调整表单提交至数据库前的提交数据
解决WPForms提交时下拉框值未替换为value_raw的问题
我明白你遇到的问题了——你已经在wpforms_process钩子中修改了$fields数组,并且通过echo看到修改后的数据是对的,但数据库里保存的还是原始的下拉框文本值。这是因为你只修改了用于显示/邮件的$fields,但没有修改最终保存到数据库的$entry数组。
修正后的代码
function wpf_dev_process( $fields, $entry, $form_data ) { // 只针对ID为66203的表单处理 if ( absint( $form_data['id'] ) !== 66203 ) { return array( $fields, $entry ); } foreach ( $fields as $key => &$value ){ if ( $fields[$key]["type"] == "select" ){ // 修改fields中的值(用于前端显示、邮件发送等场景) $fields[$key]["value"] = $fields[$key]["value_raw"]; // 同步修改entry中的对应字段值(这才是最终保存到数据库的内容) if ( isset( $entry[ $key ] ) ) { $entry[ $key ] = $fields[$key]["value_raw"]; } } } // 建议用error_log调试,避免前端输出干扰表单提交流程 // error_log( print_r( $entry, true ) ); return array( $fields, $entry ); } add_action( 'wpforms_process', 'wpf_dev_process', 10, 3 );
关键说明
$entry数组才是核心:WPForms的wpforms_process钩子允许同时修改$fields和$entry两个数组,其中数据库最终存储的是$entry里的数据,所以必须同步修改它才能让替换后的值存入数据库。- 字段键匹配逻辑:
$fields和$entry中的键都是表单字段的ID,所以可以直接用遍历得到的$key来对应修改$entry里的对应值。 - 调试方式优化:你之前用
echo输出调试内容会直接显示在页面上,可能干扰表单提交的正常流程,建议改用error_log,可以在服务器的PHP错误日志里查看修改后的$entry数据。
另外,如果你只需要调整数据库存储的内容,也可以使用更聚焦的wpforms_process_entry_save钩子,这个钩子专门用于修改即将保存到数据库的条目数据:
function wpf_dev_save_entry_data( $entry, $form_data ) { if ( absint( $form_data['id'] ) !== 66203 ) { return $entry; } // 遍历表单字段配置,找到select类型的字段 foreach ( $form_data['fields'] as $field ) { if ( $field['type'] === 'select' && isset( $entry[ $field['id'] ] ) ) { // 将对应条目值替换为value_raw $entry[ $field['id'] ] = $field['value_raw']; } } return $entry; } add_filter( 'wpforms_process_entry_save', 'wpf_dev_save_entry_data', 10, 2 );
这个钩子的优势是直接操作要保存的$entry,不需要关心$fields的修改,更适合只调整数据库存储内容的场景。
内容的提问来源于stack exchange,提问作者Yoni
相关产品推荐
相关产品推荐

