如何在Contact Form 7中实现下拉选项多值(含API标识)传递?
解决Contact Form 7多字段(位置名/邮箱/API标识)传递问题
Contact Form 7的select字段仅支持显示值|提交值的双管道格式,所以你直接添加第三个|ABC是不生效的。下面给你几个可行的实现方案:
方案1:隐藏字段+CF7钩子关联映射数据
这种方法适合需要清晰拆分字段、后续维护灵活的场景:
- 先调整表单代码,保留位置显示,新增两个隐藏字段用于存储邮箱和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]
- 在主题的
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'] ])); } }
- 对接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:自定义短代码动态生成选项
如果后续位置信息需要频繁修改,用自定义短代码可以统一维护映射关系:
- 在主题的
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]'; }
- 在CF7表单中直接使用短代码生成select:
[dynamic_location_select]
后续修改位置信息时,只需要更新functions.php中的映射数组即可,无需改动表单代码。
内容的提问来源于stack exchange,提问作者ENN9
相关产品推荐
相关产品推荐

