Contact Form 7自定义[pureair]标签提交数据邮件格式化输出问题
问题原因
- 你调用
$submission->get_posted_data()拿到的是提交数据的副本,直接修改这个数组不会生效,必须调用$submission->set_posted_data($posted_data)把修改后的数据写回提交实例,这是你之前wpcf7_before_send_mail测试不生效的核心原因。 - 你之前的特殊邮件标签回调直接返回了
pureair数组,Contact Form 7会自动把数组转为逗号分隔的字符串输出,所以只会看到一串数值。 - 你当前表单的输入框
name用的是无键名的pureair[]格式,提交后只会生成索引数组,没有字段标识,不方便解析,建议先优化表单字段的命名结构。
解决方案
步骤1:优化前端表单字段命名
把原来的无键名数组改成带层级的命名,方便后续解析数据,示例如下:
<div id="depcore-pureair-caclulator" class='depcore-pureair-caclulator'> <section class="room" data-room-number='1'> <h3 class="room-title"><?= __('Room', 'depcore-pureair') ?></h3> <div class="room-fields"> <p class="form-field"> <label for="room-height-1"><?= __('Height', 'depcore-pureair') ?></label> <input type="number" class='room' name="pureair[rooms][1][height]" id="room-height-1" min=1 step=1> cm </p> <p class="form-field"> <label for="room-width-1"><?= __('Width', 'depcore-pureair') ?></label> <input type="number" class='room' name="pureair[rooms][1][width]" id="room-width-1" min=1 step=1> cm </p> <p class="form-field"> <label for="room-length-1"><?= __('Length', 'depcore-pureair') ?></label> <input type="number" class='room' name="pureair[rooms][1][length]" id="room-length-1" min=1 step=1> cm </p> </div> <div class="windows"> <h3 class="window-title"><?= __('Glass', 'depcore-pureair') ?></h3> <div class="window" data-window-number="1"> <p class="form-field"> <label for="room-1-window-1-height"><?= __('Height', 'depcore-pureair') ?></label> <input class='window' type="number" name="pureair[rooms][1][windows][1][height]" id="room-1-window-1-height" min=1 step=1> cm </p> <p class="form-field"> <label for="room-1-window-1-width"><?= __('Width', 'depcore-pureair') ?></label> <input class='window' type="number" name="pureair[rooms][1][windows][1][width]" id="room-1-window-1-width" min=1 step=1> cm </p> </div> </div> </section> </div>
动态添加房间/窗户时,对应修改name属性里的房间编号、窗户编号即可。
步骤2:修改特殊邮件标签回调函数
直接在回调内把数组解析为格式化的字符串再返回,不需要额外调用其他钩子修改提交数据:
public function calculator_wpcf7_pureair_mail_tag($output, $name, $html){ $name = preg_replace('/^wpcf7\./', '_', $name); // 兼容旧版本 $submission = WPCF7_Submission::get_instance(); if (! $submission) { return $output; } if ('pureair' == $name) { $pureair_data = $submission->get_posted_data("pureair"); $formatted = ''; // 遍历所有房间 foreach ($pureair_data['rooms'] as $room_id => $room_info) { // 计算房间体积 单位转换:cm³转m³ $volume = round(($room_info['height'] * $room_info['width'] * $room_info['length']) / 1000000, 2); $formatted .= "房间{$room_id} 高度: {$room_info['height']}cm, 宽度: {$room_info['width']}cm, 长度: {$room_info['length']}cm, 体积: {$volume}m³\n"; $formatted .= "窗户:\n"; $total_window_area = 0; // 遍历当前房间的所有窗户 foreach ($room_info['windows'] as $window_id => $window_info) { // 计算窗户面积 单位转换:cm²转m² $area = round(($window_info['height'] * $window_info['width']) / 10000, 2); $total_window_area += $area; $formatted .= "{$window_id}: 高度: {$window_info['height']}cm, 宽度: {$window_info['width']}cm, 面积: {$area}m²\n"; } // 自定义成本计算逻辑,可根据实际需求修改 $cost = $volume * 80 + $total_window_area * 30; $formatted .= "成本: {$cost}元\n\n"; } // 如果是HTML格式邮件自动转换换行符 if ($html) { $formatted = nl2br($formatted); // 也可以自定义HTML结构比如用表格排版 } return $formatted; } return $output; }
如果不想修改前端表单命名,也可以根据你现有表单的字段顺序,把索引数组按规则拆分解析即可,比如每3个值对应一个房间的高、宽、长,之后每2个值对应一个窗户的高、宽,直到下一个房间的参数。
内容的提问来源于stack exchange,提问作者adam
相关产品推荐
相关产品推荐

