【问题标题】:How to dynamically pass an array of values to a <select> field in Contact Form 7?如何将值数组动态传递给联系表 7 中的 <select> 字段?
【发布时间】:2020-10-27 22:31:23
【问题描述】:

根据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;
}

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

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

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

这些值是从数据库中查询到的数据(比如帖子名、自定义字段等),所以即使有涉及javascript的解决方案,也需要先从php来。

【问题讨论】:

  • 你应该只做你自己的表单标签。
  • 这样做的用户案例是什么?我以前从未见过!谢谢!
  • @gtamborero 想象一下,您有一个自定义帖子类型(可能是“课程”、“产品”、“活动”等),并且您想在其模板中包含一个联系表单,所以它出现在每一个项目上。用例会自动用特定的帖子(标题(即特定的课程产品或活动)填充“选择”字段),以便在接收方更好地处理和分类电子邮件。
  • 感谢@Sekhemty,然后使用这个 cf7 插件:es.wordpress.org/plugins/contact-form-7-dynamic-text-extension

标签: javascript php wordpress forms contact-form-7


【解决方案1】:

这是我用于获取美国州的表单标签示例。这是从数组生成的&lt;select&gt;。这可能更符合您想要做的事情。

可以看到我也使用了usermetabilling_state来预选选项。

话虽如此,您还应该能够使用相同的方法来创建一个执行任何 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;
}

【讨论】:

    猜你喜欢
    • 2014-05-26
    • 2015-11-25
    • 2020-08-08
    • 2019-11-15
    • 1970-01-01
    • 2015-09-22
    • 2014-01-22
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多