如何在WPCF7_Submission中过滤空的可选提交字段?
解决Contact Form 7提交数据过滤未填写字段的问题
看起来你在处理CF7提交数据转JSON的时候踩了两个小坑,导致未填写的字段还是被塞进输出数组里了,我来帮你修正:
问题分析
- 错误使用
array_push():你本来是想给$output添加键值对(比如'subject' => 'xxx'),但array_push()是用来往数组末尾追加元素的,之前的写法不仅逻辑错误,甚至可能引发PHP警告(因为$output[$optional_field]在赋值前不存在,array_push会把它当成数组来操作)。 - 判断条件不够严格:Contact Form 7的
get_posted_data()中,未填写的字段通常会返回**空字符串""**而不是null,isset()会认为空字符串是“存在的变量”,所以判断条件会通过,导致空字段被加入输出。
修正后的完整代码
add_action( 'wpcf7_mail_sent', 'save_cf7_submission_to_json' ); function save_cf7_submission_to_json( $contact_form ) { $submission = WPCF7_Submission::get_instance(); if ( $submission ) { $data = $submission->get_posted_data(); // 初始化输出数组,先处理必填字段(加isset避免字段不存在报错) $output = [ 'name' => isset( $data['name'] ) ? $data['name'] : '' ]; // 处理可选字段,过滤未填写的内容 $optional_fields = ['subject', 'phone']; foreach ( $optional_fields as $optional_field ) { // 检查字段存在,且去除首尾空格后不为空(排除纯空格的情况) if ( isset( $data[$optional_field] ) && trim( $data[$optional_field] ) !== '' ) { $output[$optional_field] = $data[$optional_field]; } } // 以下是保存到JSON文件的示例代码(可根据需求调整路径) $json_file_path = WP_CONTENT_DIR . '/cf7_submissions.json'; // 读取现有数据(如果文件存在) if ( file_exists( $json_file_path ) ) { $existing_submissions = json_decode( file_get_contents( $json_file_path ), true ); // 防止JSON文件损坏导致的非数组情况 if ( !is_array( $existing_submissions ) ) { $existing_submissions = []; } $existing_submissions[] = $output; } else { // 文件不存在则初始化数组 $existing_submissions = [ $output ]; } // 写入JSON文件,JSON_PRETTY_PRINT让格式更易读 file_put_contents( $json_file_path, json_encode( $existing_submissions, JSON_PRETTY_PRINT ) ); } }
关键细节说明
- 替换
array_push为直接赋值:直接用$output[$optional_field] = $data[$optional_field]就能给输出数组添加指定键的字段,这才是键值对数组的正确赋值方式。 - 严格的空值判断:
trim( $data[$optional_field] ) !== ''会排除空字符串和纯空格的情况,如果你需要允许字段值为0或者"0"这类内容,可以把判断条件调整为:if ( isset( $data[$optional_field] ) && $data[$optional_field] !== '' && $data[$optional_field] !== null ) { // ... } - 字段存在性检查:所有
$data的取值都加了isset()判断,避免因为CF7表单字段名修改导致的PHP未定义索引警告。
最后提醒:确保服务器对wp-content/cf7_submissions.json文件有写入权限,否则保存会失败。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

