mindfullsilence
8/18/2014 - 4:25 PM

Custom input fields for Contact Form 7 Wordpress Plugin

Custom input fields for Contact Form 7 Wordpress Plugin

<?php
/**
 ** A base module for [select_taxonomy] and [select_taxonomy*]
 **/

/* Shortcode handler */

add_action( 'wpcf7_init', 'wpcf7_add_shortcode_select_taxonomy' );

function wpcf7_add_shortcode_select_taxonomy() {
    wpcf7_add_shortcode( array( 'select_taxonomy', 'select_taxonomy*' ),
        'wpcf7_select_taxonomy_shortcode_handler', true );
}

function wpcf7_select_taxonomy_shortcode_handler( $tag ) {
    $tag = new WPCF7_Shortcode( $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();
    $atts['tabindex'] = $tag->get_option( 'tabindex', 'int', true );

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

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

    $defaults = array();

    if ( $matches = $tag->get_first_match_option( '/^default:([0-9_]+)$/' ) )
        $defaults = explode( '_', $matches[1] );

    $multiple = $tag->has_option( 'multiple' );
    $include_blank = $tag->has_option( 'include_blank' );
    $first_as_label = $tag->has_option( 'first_as_label' );


//    $values = $tag->values;
    $taxon = $tag->values[0];

    $terms = get_terms($taxon);
    $values = array();
    foreach($terms as $index => $item) {
      $values[$index] = $item->name;
    }

    $labels = $values;

    if ( $data = (array) $tag->get_data_option() ) {
        $values = array_merge( $values, array_values( $data ) );
        $labels = array_merge( $labels, array_values( $data ) );
    }

    $empty_select = empty( $values );

    if ( $empty_select || $include_blank ) {
        array_unshift( $labels, '---' );
        array_unshift( $values, '' );
    } elseif ( $first_as_label ) {
        $values[0] = '';
    }

    $html = '';
    $hangover = wpcf7_get_hangover( $tag->name );

    foreach ( $values as $key => $value ) {
        $selected = false;

        if ( $hangover ) {
            if ( $multiple ) {
                $selected = in_array( esc_sql( $value ), (array) $hangover );
            } else {
                $selected = ( $hangover == esc_sql( $value ) );
            }
        } else {
            if ( ! $empty_select && in_array( $key + 1, (array) $defaults ) ) {
                $selected = true;
            }
        }

        $item_atts = array(
            'value' => $value,
            'selected' => $selected ? 'selected' : '' );

        $item_atts = wpcf7_format_atts( $item_atts );

        $label = isset( $labels[$key] ) ? $labels[$key] : $value;

        $html .= sprintf( '<option %1$s>%2$s</option>',
            $item_atts, esc_html( $label ) );
    }

    if ( $multiple )
        $atts['multiple'] = 'multiple';

    $atts['name'] = $tag->name . ( $multiple ? '[]' : '' );

    $atts = wpcf7_format_atts( $atts );

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

    return $html;
}


/* Validation filter */

add_filter( 'wpcf7_validate_select', 'wpcf7_select_taxonomy_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_select*', 'wpcf7_select_taxonomy_validation_filter', 10, 2 );

function wpcf7_select_taxonomy_validation_filter( $result, $tag ) {
    $tag = new WPCF7_Shortcode( $tag );

    $name = $tag->name;

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

    if ( $tag->is_required() ) {
        if ( ! isset( $_POST[$name] )
            || empty( $_POST[$name] ) && '0' !== $_POST[$name] ) {
            $result['valid'] = false;
            $result['reason'][$name] = wpcf7_get_message( 'invalid_required' );
        }
    }

    if ( isset( $result['reason'][$name] ) && $id = $tag->get_id_option() ) {
        $result['idref'][$name] = $id;
    }

    return $result;
}


/* Tag generator */

add_action( 'admin_init', 'wpcf7_add_taxonomy_tag_generator_menu', 25 );

function wpcf7_add_taxonomy_tag_generator_menu() {
    if ( ! function_exists( 'wpcf7_add_tag_generator' ) )
        return;

    wpcf7_add_tag_generator( 'select_taxonomy', __( 'Taxonomy dropdown menu', 'contact-form-7' ),
        'wpcf7-tg-pane-select-taxonomy', 'wpcf7_tg_pane_select_taxonomy' );
}

function wpcf7_tg_pane_select_taxonomy( $contact_form ) {
    ?>
    <div id="wpcf7-tg-pane-select-taxonomy" class="hidden">
        <form action="">
            <table>
                <tr><td><input type="checkbox" name="required" />&nbsp;<?php echo esc_html( __( 'Required field?', 'contact-form-7' ) ); ?></td></tr>
                <tr><td><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?><br /><input type="text" name="name" class="tg-name oneline" /></td><td></td></tr>
            </table>

            <table>
                <tr>
                    <td><code>id</code> (<?php echo esc_html( __( 'optional', 'contact-form-7' ) ); ?>)<br />
                        <input type="text" name="id" class="idvalue oneline option" /></td>

                    <td><code>class</code> (<?php echo esc_html( __( 'optional', 'contact-form-7' ) ); ?>)<br />
                        <input type="text" name="class" class="classvalue oneline option" /></td>
                </tr>

                <tr>
                    <td><?php echo esc_html( __( 'Post Type', 'contact-form-7' ) ); ?><br />
                        <select name="values">
	                          <?php $args = array();
                            $taxons = get_taxonomies($args, 'objects');
                            foreach($taxons as $taxon) : ?>
                                <option value="<?= $taxon->name; ?>"><?= $taxon->labels->menu_name; ?></option>
                            <?php endforeach; ?>
                        </select><br />
                        <span style="font-size: smaller"><?php echo esc_html( __( "* What is the name of the taxonomy?", 'contact-form-7' ) ); ?></span>
                    </td>

                    <td>
                        <br /><input type="checkbox" name="multiple" class="option" />&nbsp;<?php echo esc_html( __( 'Allow multiple selections?', 'contact-form-7' ) ); ?>
                        <br /><input type="checkbox" name="include_blank" class="option" />&nbsp;<?php echo esc_html( __( 'Insert a blank item as the first option?', 'contact-form-7' ) ); ?>
                    </td>
                </tr>
            </table>

            <div class="tg-tag"><?php echo esc_html( __( "Copy this code and paste it into the form left.", 'contact-form-7' ) ); ?><br /><input type="text" name="select_taxonomy" class="tag wp-ui-text-highlight code" readonly="readonly" onfocus="this.select()" /></div>

            <div class="tg-mail-tag"><?php echo esc_html( __( "And, put this code into the Mail fields below.", 'contact-form-7' ) ); ?><br /><input type="text" class="mail-tag wp-ui-text-highlight code" readonly="readonly" onfocus="this.select()" /></div>
        </form>
    </div>
<?php
}

?>
<?php
/**
 ** A base module for [select_posttype] and [select_posttype*]
 **/

/* Shortcode handler */

add_action( 'wpcf7_init', 'wpcf7_add_shortcode_select_posttype' );

function wpcf7_add_shortcode_select_posttype() {
    wpcf7_add_shortcode( array( 'select_posttype', 'select_posttype*' ),
        'wpcf7_select_posttype_shortcode_handler', true );
}

function wpcf7_select_posttype_shortcode_handler( $tag ) {
    $tag = new WPCF7_Shortcode( $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();
    $atts['tabindex'] = $tag->get_option( 'tabindex', 'int', true );

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

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

    $defaults = array();

    if ( $matches = $tag->get_first_match_option( '/^default:([0-9_]+)$/' ) )
        $defaults = explode( '_', $matches[1] );

    $multiple = $tag->has_option( 'multiple' );
    $include_blank = $tag->has_option( 'include_blank' );
    $first_as_label = $tag->has_option( 'first_as_label' );


//    $values = $tag->values;
    $post_type = $tag->values[0];

    $posts = get_posts(
      array(
          'post_type' => $post_type,
          'post_status' => 'publish'
      )
    );
    $values = array();
    foreach($posts as $index => $item) {
      $values[$index] = $item->post_title;
    }

    $labels = $values;

    if ( $data = (array) $tag->get_data_option() ) {
        $values = array_merge( $values, array_values( $data ) );
        $labels = array_merge( $labels, array_values( $data ) );
    }

    $empty_select = empty( $values );

    if ( $empty_select || $include_blank ) {
        array_unshift( $labels, '---' );
        array_unshift( $values, '' );
    } elseif ( $first_as_label ) {
        $values[0] = '';
    }

    $html = '';
    $hangover = wpcf7_get_hangover( $tag->name );

    foreach ( $values as $key => $value ) {
        $selected = false;

        if ( $hangover ) {
            if ( $multiple ) {
                $selected = in_array( esc_sql( $value ), (array) $hangover );
            } else {
                $selected = ( $hangover == esc_sql( $value ) );
            }
        } else {
            if ( ! $empty_select && in_array( $key + 1, (array) $defaults ) ) {
                $selected = true;
            }
        }

        $item_atts = array(
            'value' => $value,
            'selected' => $selected ? 'selected' : '' );

        $item_atts = wpcf7_format_atts( $item_atts );

        $label = isset( $labels[$key] ) ? $labels[$key] : $value;

        $html .= sprintf( '<option %1$s>%2$s</option>',
            $item_atts, esc_html( $label ) );
    }

    if ( $multiple )
        $atts['multiple'] = 'multiple';

    $atts['name'] = $tag->name . ( $multiple ? '[]' : '' );

    $atts = wpcf7_format_atts( $atts );

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

    return $html;
}


/* Validation filter */

add_filter( 'wpcf7_validate_select', 'wpcf7_select_posttype_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_select*', 'wpcf7_select_posttype_validation_filter', 10, 2 );

function wpcf7_select_posttype_validation_filter( $result, $tag ) {
    $tag = new WPCF7_Shortcode( $tag );

    $name = $tag->name;

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

    if ( $tag->is_required() ) {
        if ( ! isset( $_POST[$name] )
            || empty( $_POST[$name] ) && '0' !== $_POST[$name] ) {
            $result['valid'] = false;
            $result['reason'][$name] = wpcf7_get_message( 'invalid_required' );
        }
    }

    if ( isset( $result['reason'][$name] ) && $id = $tag->get_id_option() ) {
        $result['idref'][$name] = $id;
    }

    return $result;
}


/* Tag generator */

add_action( 'admin_init', 'wpcf7_add_posttype_tag_generator_menu', 25 );

function wpcf7_add_posttype_tag_generator_menu() {
    if ( ! function_exists( 'wpcf7_add_tag_generator' ) )
        return;

    wpcf7_add_tag_generator( 'select_posttype', __( 'Post-Type dropdown menu', 'contact-form-7' ),
        'wpcf7-tg-pane-select-posttype', 'wpcf7_tg_pane_select_posttype' );
}

function wpcf7_tg_pane_select_posttype( $contact_form ) {
    ?>
    <div id="wpcf7-tg-pane-select-posttype" class="hidden">
        <form action="">
            <table>
                <tr><td><input type="checkbox" name="required" />&nbsp;<?php echo esc_html( __( 'Required field?', 'contact-form-7' ) ); ?></td></tr>
                <tr><td><?php echo esc_html( __( 'Name', 'contact-form-7' ) ); ?><br /><input type="text" name="name" class="tg-name oneline" /></td><td></td></tr>
            </table>

            <table>
                <tr>
                    <td><code>id</code> (<?php echo esc_html( __( 'optional', 'contact-form-7' ) ); ?>)<br />
                        <input type="text" name="id" class="idvalue oneline option" /></td>

                    <td><code>class</code> (<?php echo esc_html( __( 'optional', 'contact-form-7' ) ); ?>)<br />
                        <input type="text" name="class" class="classvalue oneline option" /></td>
                </tr>

                <tr>
                    <td><?php echo esc_html( __( 'Post Type', 'contact-form-7' ) ); ?><br />
                        <select name="values">
                            <?php $post_types = get_post_types(array('public'   => true, '_builtin' => false), 'objects');
                            foreach($post_types as $post_type) : ?>
                                <option value="<?= $post_type->query_var; ?>"><?= $post_type->name; ?></option>
                            <?php endforeach; ?>
                        </select><br />
                        <span style="font-size: smaller"><?php echo esc_html( __( "* What is the name of the post type?", 'contact-form-7' ) ); ?></span>
                    </td>

                    <td>
                        <br /><input type="checkbox" name="multiple" class="option" />&nbsp;<?php echo esc_html( __( 'Allow multiple selections?', 'contact-form-7' ) ); ?>
                        <br /><input type="checkbox" name="include_blank" class="option" />&nbsp;<?php echo esc_html( __( 'Insert a blank item as the first option?', 'contact-form-7' ) ); ?>
                    </td>
                </tr>
            </table>

            <div class="tg-tag"><?php echo esc_html( __( "Copy this code and paste it into the form left.", 'contact-form-7' ) ); ?><br /><input type="text" name="select_posttype" class="tag wp-ui-text-highlight code" readonly="readonly" onfocus="this.select()" /></div>

            <div class="tg-mail-tag"><?php echo esc_html( __( "And, put this code into the Mail fields below.", 'contact-form-7' ) ); ?><br /><input type="text" class="mail-tag wp-ui-text-highlight code" readonly="readonly" onfocus="this.select()" /></div>
        </form>
    </div>
<?php
}

?>