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

如何在Contact Form 7中实现下拉选项多值(含API标识)传递?

解决Contact Form 7多字段(位置名/邮箱/API标识)传递问题

Contact Form 7的select字段仅支持显示值|提交值的双管道格式,所以你直接添加第三个|ABC是不生效的。下面给你几个可行的实现方案:


方案1:隐藏字段+CF7钩子关联映射数据

这种方法适合需要清晰拆分字段、后续维护灵活的场景:

  1. 先调整表单代码,保留位置显示,新增两个隐藏字段用于存储邮箱和API标识:
[md-select label="location"][select* dept-loc1 include_blank
"Location 1|Location 1"
"Location 2|Location 2"
"Location 3|Location 3"
"Location 4|Location 4"
[/md-select]
[hidden dept-email]
[hidden api-endpoint]
  1. 在主题的functions.php文件中添加钩子逻辑,根据选中的位置自动填充对应邮箱和API标识:
add_action('wpcf7_before_send_mail', 'bind_cf7_location_data');
function bind_cf7_location_data($contact_form) {
    $submission = WPCF7_Submission::get_instance();
    if (!$submission) return;
    
    $posted_data = $submission->get_posted_data();
    $selected_location = $posted_data['dept-loc1'];
    
    // 定义位置与邮箱、API标识的映射关系
    $location_mapping = [
        'Location 1' => ['email' => 'testloc1@test.com', 'api' => 'ABC'],
        'Location 2' => ['email' => 'testloc2@test.com', 'api' => 'ABC'],
        'Location 3' => ['email' => 'testloc3@test.com', 'api' => 'ABC'],
        'Location 4' => ['email' => 'testloc4@test.com', 'api' => 'ABC']
    ];
    
    // 匹配到对应数据后,给隐藏字段赋值
    if (isset($location_mapping[$selected_location])) {
        $submission->set_posted_data(array_merge($posted_data, [
            'dept-email' => $location_mapping[$selected_location]['email'],
            'api-endpoint' => $location_mapping[$selected_location]['api']
        ]));
    }
}
  1. 对接API时,直接调用dept-loc1(位置名称)、dept-email(对应邮箱)、api-endpoint(API标识)三个字段即可。

方案2:在select提交值中嵌入结构化数据

这种方法无需额外钩子,直接把多字段数据打包到提交值里,适合逻辑简单的场景:

调整表单的select选项,用自定义分隔符(比如||)把位置名、邮箱、API标识拼接成提交值:

[md-select label="location"][select* dept-loc1 include_blank
"Location 1|Location 1||testloc1@test.com||ABC"
"Location 2|Location 2||testloc2@test.com||ABC"
"Location 3|Location 3||testloc3@test.com||ABC"
"Location 4|Location 4||testloc4@test.com||ABC"
[/md-select]

在API对接的处理代码中,拆分提交值获取各字段:

// 假设$posted_data['dept-loc1']是表单提交的打包值
$field_parts = explode('||', $posted_data['dept-loc1']);
$location_name = $field_parts[0];
$location_email = $field_parts[1];
$api_endpoint = $field_parts[2];

方案3:自定义短代码动态生成选项

如果后续位置信息需要频繁修改,用自定义短代码可以统一维护映射关系:

  1. 在主题的functions.php中添加短代码逻辑:
add_shortcode('dynamic_location_select', 'generate_dynamic_location_options');
function generate_dynamic_location_options() {
    $location_mapping = [
        'Location 1' => ['email' => 'testloc1@test.com', 'api' => 'ABC'],
        'Location 2' => ['email' => 'testloc2@test.com', 'api' => 'ABC'],
        'Location 3' => ['email' => 'testloc3@test.com', 'api' => 'ABC'],
        'Location 4' => ['email' => 'testloc4@test.com', 'api' => 'ABC']
    ];
    
    $options_html = '';
    foreach ($location_mapping as $name => $data) {
        $submit_value = $name . '||' . $data['email'] . '||' . $data['api'];
        $options_html .= '"' . esc_attr($name) . '|' . esc_attr($submit_value) . '"' . "\n";
    }
    
    return '[md-select label="location"][select* dept-loc1 include_blank ' . $options_html . '[/md-select]';
}
  1. 在CF7表单中直接使用短代码生成select:
[dynamic_location_select]

后续修改位置信息时,只需要更新functions.php中的映射数组即可,无需改动表单代码。


内容的提问来源于stack exchange,提问作者ENN9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:27:49