如何以联系表单7制作自定义表单标记

时间:2017-03-14 16:56:00

标签: wordpress contact-form-7

所以我以联系表格7制作自定义表格标签!这是我的课程列表的下拉菜单,现在我想要它是必需的,因为这是整个形式的主要内容。 那么有人可以给我一个提示如何做到这一点?

当我执行[myCustomField* course-name class:custom-field]

不适用于 * 所以如果有人可以帮助它会很棒!

2 个答案:

答案 0 :(得分:3)

您可以使用HashMap输出所需的下拉菜单。

[select*]

检查https://contactform7.com/checkboxes-radio-buttons-and-menus/

编辑:

所以你有自己的短代码[select* course-name include_blank "English" "Math"] 。要将短代码的两个版本设为[myCustomField][myCustomField],您必须将两个短代码传递给您的函数,如下所示:

[myCustomField*]

然后,您可以使用它:

add_action( 'wpcf7_init', 'wpcf7_add_form_tag_mycustomfield' );

function wpcf7_add_form_tag_mycustomfield() {
    wpcf7_add_form_tag( array( 'myCustomField', 'myCustomField*'),
        'wpcf7_mycustomfield_form_tag_handler', array( 'name-attr' => true ) );
}

function wpcf7_mycustomfield_form_tag_handler( $tag ) {
    $tag = new WPCF7_FormTag( $tag );

    if ( empty( $tag->name ) ) {
        return '';
    }

    $atts = array();

    $class = wpcf7_form_controls_class( $tag->type );
    $atts['class'] = $tag->get_class_option( $class );
    $atts['id'] = $tag->get_id_option();

    $atts['name'] = $tag->name;
    $atts = wpcf7_format_atts( $atts );

    $html = sprintf( '<your-tag %s></your-tag>', $atts );
    return $html;
}

[myCustomField course-name class:custom-field]

<强>参考文献:

答案 1 :(得分:0)

我今天下午一直在努力解决这个问题,我认为Mahmoud并没有添加所需的一切,以确保验证工作正常并显示消息。

使用我从联系表格7上的帖子中学到的知识: https://contactform7.com/2015/01/10/adding-a-custom-form-tag https://contactform7.com/2015/02/27/using-values-from-a-form-tag/

并在插件中查看此文件:contact-form-7 / modules / select.php,它有很多帮助。

我认为这会更好用,需要添加到子主题的functions.php文件中。

add_action( 'wpcf7_init', 'custom_add_form_tag_myCustomField' );

function custom_add_form_tag_myCustomField() {
    wpcf7_add_form_tag( array( 'myCustomField', 'myCustomField*' ), 
'custom_myCustomField_form_tag_handler', true );
}

function custom_myCustomField_form_tag_handler( $tag ) {

    $tag = new WPCF7_FormTag( $tag );

    if ( empty( $tag->name ) ) {
        return '';
    }

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

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

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

    $atts = array();

    $atts['class'] = $tag->get_class_option( $class );
    $atts['id'] = $tag->get_id_option();

    if ( $tag->is_required() ) {
    $atts['aria-required'] = 'true';
    }

    $atts['aria-invalid'] = $validation_error ? 'true' : 'false';

    $atts['name'] = $tag->name;

    $atts = wpcf7_format_atts( $atts );

    $myCustomField = '';

    $query = new WP_Query(array(
        'post_type' => 'CUSTOM POST TYPE HERE',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'orderby'       => 'title',
        'order'         => 'ASC',
    ));

    while ($query->have_posts()) {
        $query->the_post();
        $post_title = get_the_title();
        $myCustomField .= sprintf( '<option value="%1$s">%1$s</option>', 
esc_html( $post_title ) );
    }

    wp_reset_query();

    $myCustomField = sprintf(
        '<span class="wpcf7-form-control-wrap %1$s"><select %2$s>%3$s</select>%4$s</span>',
        sanitize_html_class( $tag->name ),
        $atts,
        $myCustomField,
        $validation_error
    );

    return $myCustomField;
}

这就是我们创建自定义标签的方式。这里的重要区别是添加了$ validation_error变量以及aria-required和aria-invalid数据。在最终输出中包含$ validation_error也很重要,这样我们就可以看到正在创建的验证消息。

然后,为了完成它,我们需要通过过滤器添加一些验证。

目前还没有关于此的文档,但我使用了select.php中的函数并将其更改为我需要的内容。

/* Validation filter */

add_filter( 'wpcf7_validate_myCustomField', 'wpcf7_myCustomField_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_myCustomField*', 'wpcf7_myCustomField_validation_filter', 10, 2 );

function wpcf7_myCustomField_validation_filter( $result, $tag ) {
    $tag = new WPCF7_FormTag( $tag );

    $name = $tag->name;

    if ( isset( $_POST[$name] ) && is_array( $_POST[$name] ) ) {
        foreach ( $_POST[$name] as $key => $value ) {
            if ( '' === $value ) {
                unset( $_POST[$name][$key] );
            }
        }
    }

    $empty = ! isset( $_POST[$name] ) || empty( $_POST[$name] ) && '0' !== $_POST[$name];

    if ( $tag->is_required() && $empty ) {
        $result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
    }

    return $result;
}

此代码也应该放在自定义CF7标记代码下的functions.php文件中。

此处过滤器的第一个字符串$ tag应与自定义CF7标记中生成的类匹配,因此,如果您的自定义标记 - > type ='myCustomField',则过滤器的$标记必须包含名称,例如所以wpcf7_validate_myCustomField以及它所需的版本,wpcf7_validate_myCustomField *。

我希望能帮助其他人寻找这个。

如果您想从Contact Form 7的后端获得更多可用选项,请检查select.php文件,因为它很好地说明了如何获取每个选项并包含它。