如何添加自定义属性?

时间:2017-09-18 07:59:32

标签: wordpress contact-form-7

如何在字段Contact Form 7 中添加自定义属性而不使用javascript

例如,页面上有这样一个字段:

<input type="text" name="name" class="form-control" id="name-1" data-attr="custom" data-msg="Текст 1"> 

问题:是否可以在管理面板中设置这些字段的自定义属性(data-attrdata-msg)?

5 个答案:

答案 0 :(得分:14)

找到您的字段的名称。

y

如果您的字段名称=&#34; text-21&#34;,就像在我的示例中一样,请将此代码添加到function.php文件中。

[text* text-21]

注意,它会将自定义属性添加到名称为text-21的所有表单元素中,在所有名称为&#34; text-21的表单中,如果要阻止它,则为表单元素添加一些唯一名称[ text * inique-name]

然后将代码更改为

add_filter( 'wpcf7_form_elements', 'imp_wpcf7_form_elements' );
function imp_wpcf7_form_elements( $content ) {
    $str_pos = strpos( $content, 'name="text-21"' );
    $content = substr_replace( $content, ' data-attr="custom" data-msg="Текст 1" ', $str_pos, 0 );
    return $content;
}

答案 1 :(得分:1)

还可以添加多个属性。例如

add_filter( 'wpcf7_form_elements', 'imp_wpcf7_form_elements' );

function imp_wpcf7_form_elements( $content ) {
    $str_pos = strpos( $content, 'name="your-email-homepage"' );
    $content = substr_replace( $content, ' aria-describedby="emailHelp" ', $str_pos, 0 );

    $str_pos2 = strpos( $content, 'name="your-fname-homepage"' );
    $content = substr_replace( $content, ' aria-describedby="fnameHelp" ', $str_pos2, 0 );

    $str_pos3 = strpos( $content, 'name="your-lname-homepage"' );
    $content = substr_replace( $content, ' aria-describedby="lnameHelp" ', $str_pos3, 0 );
    return $content;        
}

答案 2 :(得分:1)

这是一个真正的解决方案,不涉及对名称和属性进行硬编码

add_filter( 'wpcf7_form_tag', function ( $tag ) {
    $datas = [];
    foreach ( (array)$tag['options'] as $option ) {
        if ( strpos( $option, 'data-' ) === 0 ) {
            $option = explode( ':', $option, 2 );
            $datas[$option[0]] = $option[1];
        }
    }
    if ( ! empty( $datas ) ) {
        $name = $tag['name'];
        $tag['name'] = $id = uniqid();
        add_filter( 'wpcf7_form_elements', function ($content) use ($name, $id, $datas) {
            return str_replace("name=\"$id\"", "name=\"$name\" ". wpcf7_format_atts($datas), $content);
        });
    }
    return $tag;
} );

它适用于所有数据属性,因此您可以像这样使用它

[text* my-name data-foo:bar data-biz:baz]
Output: <input type="text" name="my-name" data-foo="bar" data-biz="baz">

由于wpcf7没有提供直接挂钩选项的解决方案,因此解决方案使用了一个技巧,并用唯一的ID临时替换了字段名称,然后在以后的过滤器中将其替换为正确的名称和添加的属性

如果您需要它不仅用于数据属性,还可以通过替换此行来将更多属性列入白名单

if ( strpos( $option, 'data-' ) === 0 ) {

类似于以下内容

if ( preg_match( '/^(data-|pattern|my-custom-attribute)/', $option ) ) {

答案 3 :(得分:1)

从Tofandel的解决方案中扩展,以那些获得99%的解决方案但遇到验证问题的人的利益为例-我已经解决了我的情况,并希望提供一种扩展的解决方案,该解决方案可以达到Tofandel的解决方案(将属性放入适当的表单中),而且在提交时也可以成功进行验证。

    add_filter('wpcf7_form_tag', function($tag) {
      $data = [];
      foreach ((array)$tag['options'] as $option) {
        if (strpos( $option, 'autocomplete') === 0) {
          $option = explode(':', $option, 2);
          $data[$option[0]] = apply_filters('wpcf7_option_value', $option[1], $option[0]);
        }
      }
      if(!empty($data)) {
        add_filter('wpcf7_form_elements', function ($content) use ($tag, $data) {
          $data_attrs = wpcf7_format_atts($data);
          $name = $tag['name'];
          $content_plus_data_attrs = str_replace("name=\"$name\"", "name=\"$name\" " . $data_attrs, $content);

          return $content_plus_data_attrs;
        });
      }
      return $tag;
    } );

我们并没有将标签ID更改为随机值,而只是稍后将其替换为“真实”值,而是仅首先引用了真实值,替换了wpcf7_form_elements过滤器中内容的相关部分(在我的情况下为自动完成,但正如Tofandel的示例所示,可以将其扩展为您想要的任何数据属性。

答案 4 :(得分:-1)

它可能很旧,但是对于遇到此问题的您来说,我可以通过执行以下操作来克服它:

假设这是以下形式:

 public class Player
{
    public string steamid { get; set; }
    public int communityvisibilitystate { get; set; }
    public int profilestate { get; set; }
    public string personaname { get; set; }
    public int lastlogoff { get; set; }
    public int commentpermission { get; set; }
    public string profileurl { get; set; }
    public string avatar { get; set; }
    public string avatarmedium { get; set; }
    public string avatarfull { get; set; }
    public int personastate { get; set; }
    public string realname { get; set; }
    public string primaryclanid { get; set; }
    public int timecreated { get; set; }
    public int personastateflags { get; set; }
}

public class Response
{
    public List<Player> players { get; set; }
}

您可以在脚本标签内添加以下代码:

<script>
hbspt.forms.create({
    css: '',
    portalId: '',
    formId: 'YOUR_FORM_ID'
});
</script>

引用:https://developers.hubspot.com/global-form-events