You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Contact Form 7自定义[pureair]标签提交数据邮件格式化输出问题

问题原因

  1. 你调用$submission->get_posted_data()拿到的是提交数据的副本,直接修改这个数组不会生效,必须调用$submission->set_posted_data($posted_data)把修改后的数据写回提交实例,这是你之前wpcf7_before_send_mail测试不生效的核心原因。
  2. 你之前的特殊邮件标签回调直接返回了pureair数组,Contact Form 7会自动把数组转为逗号分隔的字符串输出,所以只会看到一串数值。
  3. 你当前表单的输入框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>&nbsp;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>&nbsp;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>&nbsp;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>&nbsp;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>&nbsp;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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:36:01