如何将值数组动态传递到 Contact Form 7 中的 <select> 字段?

How to dynamically pass an array of values to a <select> field in Contact Form 7?

根据official Contact Form 7 docs,可以通过短代码将默认值传递给 CF7,这样:

// field in CF7 in Wordpress admin area

[email* destination-email default:shortcode_attr]
// shortcode in a Wordpress php template

[contact-form-7 id="123" title="Contact Form" destination-email="xxxxxx@example.com"]
// function in functions.php

add_filter( 'shortcode_atts_wpcf7', 'custom_shortcode_atts_wpcf7_filter', 10, 3 );
 
function custom_shortcode_atts_wpcf7_filter( $out, $pairs, $atts ) {
  $my_attr = 'destination-email';
 
  if ( isset( $atts[$my_attr] ) ) {
    $out[$my_attr] = $atts[$my_attr];
  }
 
  return $out;
}

这适用于一个简单的文本字段,但我需要将一组值传递给 <select> 字段并在其中将它们用作 <option>;我试图修改一下这段代码,但显然它不起作用,或者至少我没能做到。

是否可以使用短代码将动态数据发送到 CF7,即使不是像这样的单个纯文本?

如果没有,我愿意接受所有其他类型的解决方案,即使它涉及另一种方法或一些额外的插件; 是否有其他方法可以将值数组动态发送到 Contact Form 7 中的 <select> 字段?

这些值是从数据库中查询出来的数据(如post姓名、自定义字段等),所以需要先从php中获取,即使有解决方案涉及 javascript.

这是我用于获取美国各州的表单标记示例。这是从数组生成的 <select>。这可能更符合你想做的事情。

你看我也是用usermetabilling_state来pre-select的选择。

话虽如此,您也应该能够使用相同的方法创建一个 select 标签,该标签执行任何 WP_Query 并将结果放入选项标签。

<?php

add_action('wpcf7_init', function (){
    wpcf7_add_form_tag( array('dd_states', 'dd_states*'), 'cf7_state_dropdown' , true );
});
function cf7_state_dropdown($tag) {

    $tag = new WPCF7_FormTag( $tag );

    $atts = array();

    $validation_error = wpcf7_get_validation_error( $tag->type );

    $class = wpcf7_form_controls_class( $tag->type );

    if ( $validation_error ) {
        $class .= ' wpcf7-not-valid';
    }

    $atts['class'] = $tag->get_class_option( $class );
    $atts['aria-required'] = 'true';
    $atts['aria-invalid'] = $validation_error ? 'true' : 'false';

    $atts = wpcf7_format_atts( $atts );

    // Get User ID and Billing State from DB
    $userid = get_current_user_id();
    $user_state = get_user_meta($userid, 'billing_state', true);

      $states = array ( 'FL'=>'Florida','AL'=>'Alabama','AK'=>'Alaska','AZ'=>'Arizona','AR'=>'Arkansas','CA'=>'California','CO'=>'Colorado','CT'=>'Connecticut','DE'=>'Delaware','DC'=>'District of Columbia','GA'=>'Georgia','HI'=>'Hawaii','ID'=>'Idaho','IL'=>'Illinois','IN'=>'Indiana','IA'=>'Iowa','KS'=>'Kansas','KY'=>'Kentucky','LA'=>'Louisiana','ME'=>'Maine','MD'=>'Maryland','MA'=>'Massachusetts','MI'=>'Michigan','MN'=>'Minnesota','MS'=>'Mississippi','MO'=>'Missouri','MT'=>'Montana','NE'=>'Nebraska','NV'=>'Nevada','NH'=>'New Hampshire','NJ'=>'New Jersey','NM'=>'New Mexico','NY'=>'New York','NC'=>'North Carolina','ND'=>'North Dakota','OH'=>'Ohio','OK'=>'Oklahoma','OR'=>'Oregon','PA'=>'Pennsylvania','RI'=>'Rhode Island','SC'=>'South Carolina','SD'=>'South Dakota','TN'=>'Tennessee','TX'=>'Texas','UT'=>'Utah','VT'=>'Vermont','VA'=>'Virginia','WA'=>'Washington','WV'=>'West Virginia','WI'=>'Wisconsin','WY'=>'Wyoming');

    $output = '<span class="wpcf7-form-control-wrap '.sanitize_html_class( $tag->name ).'"><select name="state" id="state" '.$atts.'>';
    $output .= "<option value=\"\"> - - Choose State - - </option>";
    foreach ($states as $abbrev=>$state){
    $selected = ($user_state == $abbrev) ? ' selected="selected"' : '';
        $output .= '<option value="'.$abbrev.'"'. $selected .'>'.$state.'</option>';
    }
    $output .= "</select></span>";
    $output .= $validation_error;

    return $output;
}