true, 'selectable-values' => true, ) ); } function wpcf7_select_form_tag_handler( $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'; $multiple = $tag->has_option( 'multiple' ); $include_blank = $tag->has_option( 'include_blank' ); $first_as_label = $tag->has_option( 'first_as_label' ); if ( $tag->has_option( 'size' ) ) { $size = $tag->get_option( 'size', 'int', true ); if ( $size ) { $atts['size'] = $size; } elseif ( $multiple ) { $atts['size'] = 4; } else { $atts['size'] = 1; } } $values = $tag->values; $labels = $tag->labels; if ( $data = (array) $tag->get_data_option() ) { $values = array_merge( $values, array_values( $data ) ); $labels = array_merge( $labels, array_values( $data ) ); } $defaults = array(); $default_choice = $tag->get_default_option( null, 'multiple=1' ); foreach ( $default_choice as $value ) { $key = array_search( $value, $values, true ); if ( false !== $key ) { $defaults[] = (int) $key + 1; } } if ( $matches = $tag->get_first_match_option( '/^default:([0-9_]+)$/' ) ) { $defaults = array_merge( $defaults, explode( '_', $matches[1] ) ); } $defaults = array_unique( $defaults ); $shifted = false; if ( $include_blank || empty( $values ) ) { array_unshift( $labels, '---' ); array_unshift( $values, '' ); $shifted = true; } 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 ( ! $shifted && in_array( (int) $key + 1, (array) $defaults ) ) { $selected = true; } elseif ( $shifted && in_array( (int) $key, (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( '', $item_atts, esc_html( $label ) ); } if ( $multiple ) { $atts['multiple'] = 'multiple'; } $atts['name'] = $tag->name . ( $multiple ? '[]' : '' ); $atts = wpcf7_format_atts( $atts ); $html = sprintf( '%4$s', sanitize_html_class( $tag->name ), $atts, $html, $validation_error ); return $html; } /* Validation filter */ add_filter( 'wpcf7_validate_select', 'wpcf7_select_validation_filter', 10, 2 ); add_filter( 'wpcf7_validate_select*', 'wpcf7_select_validation_filter', 10, 2 ); function wpcf7_select_validation_filter( $result, $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; } /* Tag generator */ add_action( 'wpcf7_admin_init', 'wpcf7_add_tag_generator_menu', 25 ); function wpcf7_add_tag_generator_menu() { $tag_generator = WPCF7_TagGenerator::get_instance(); $tag_generator->add( 'menu', __( 'drop-down menu', 'contact-form-7' ), 'wpcf7_tag_generator_menu' ); } function wpcf7_tag_generator_menu( $contact_form, $args = '' ) { $args = wp_parse_args( $args, array() ); $description = __( "Generate a form-tag for a drop-down menu. For more details, see %s.", 'contact-form-7' ); $desc_link = wpcf7_link( __( 'https://contactform7.com/checkboxes-radio-buttons-and-menus/', 'contact-form-7' ), __( 'Checkboxes, Radio Buttons and Menus', 'contact-form-7' ) ); ?>