Last active
March 29, 2016 14:54
-
-
Save Loac-fr/728d4be45ee31e5c52e0 to your computer and use it in GitHub Desktop.
Modify Contact form 7 plugin checkbox behavior
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// to drop in functions.php | |
// changes occur at line 120 | |
add_action( 'wpcf7_init', 'wpcf7_add_shortcode_checkbox_alt' ); | |
function wpcf7_add_shortcode_checkbox_alt() { | |
wpcf7_add_shortcode( array( 'checkbox', 'checkbox*', 'radio' ), | |
'my_checkbox', true ); | |
} | |
function my_checkbox( $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'; | |
$label_first = $tag->has_option( 'label_first' ); | |
$use_label_element = $tag->has_option( 'use_label_element' ); | |
$exclusive = $tag->has_option( 'exclusive' ); | |
$free_text = $tag->has_option( 'free_text' ); | |
$multiple = false; | |
if ( 'checkbox' == $tag->basetype ) | |
$multiple = ! $exclusive; | |
else // radio | |
$exclusive = false; | |
if ( $exclusive ) | |
$class .= ' wpcf7-exclusive-checkbox'; | |
$atts = array(); | |
$atts['class'] = $tag->get_class_option( $class ); | |
// $atts['id'] = $tag->get_id_option(); | |
$tabindex = $tag->get_option( 'tabindex', 'int', true ); | |
if ( false !== $tabindex ) | |
$tabindex = absint( $tabindex ); | |
$html = ''; | |
$count = 0; | |
$values = (array) $tag->values; | |
$labels = (array) $tag->labels; | |
if ( $data = (array) $tag->get_data_option() ) { | |
if ( $free_text ) { | |
$values = array_merge( | |
array_slice( $values, 0, -1 ), | |
array_values( $data ), | |
array_slice( $values, -1 ) ); | |
$labels = array_merge( | |
array_slice( $labels, 0, -1 ), | |
array_values( $data ), | |
array_slice( $labels, -1 ) ); | |
} else { | |
$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 ); | |
$hangover = wpcf7_get_hangover( $tag->name, $multiple ? array() : '' ); | |
foreach ( $values as $key => $value ) { | |
$class = 'wpcf7-list-item'; | |
$checked = false; | |
if ( $hangover ) { | |
if ( $multiple ) { | |
$checked = in_array( esc_sql( $value ), (array) $hangover ); | |
} else { | |
$checked = ( $hangover == esc_sql( $value ) ); | |
} | |
} else { | |
$checked = in_array( $key + 1, (array) $defaults ); | |
} | |
if ( isset( $labels[$key] ) ) | |
$label = $labels[$key]; | |
else | |
$label = $value; | |
$item_atts = array( | |
'type' => $tag->basetype, | |
// 'name' => $tag->name . ( $multiple ? '[]' : '' ), | |
'name' => $tag->name , | |
'value' => $value, | |
'checked' => $checked ? 'checked' : '', | |
'tabindex' => $tabindex ? $tabindex : '' , | |
'id' => $tag->get_id_option() | |
); | |
$item_atts = wpcf7_format_atts( $item_atts ); | |
if ( $label_first ) { // put label first, input last | |
// $item = sprintf( | |
// '<label class="wpcf7-list-item-label">%1$s</label> <input %2$s />', | |
// esc_html( $label ), $item_atts ); | |
$item = '<label for="'. $tag->get_id_option() .'" class="wpcf7-list-item-label">'.esc_html( $label ).'</label><input '.$item_atts.' />'; | |
} else { | |
// $item = sprintf( | |
// '<input %2$s /><label for="%1$s" class="wpcf7-list-item-label">%1$s</label>', | |
// esc_html( $label ), $item_atts ); | |
$item = '<input '.$item_atts.' /><label for="'. $tag->get_id_option() .'" class="wpcf7-list-item-label">'.esc_html( $label ).'</label>'; | |
} | |
if ( $use_label_element ) | |
$item = '<label>' . $item . '</label>'; | |
if ( false !== $tabindex ) | |
$tabindex += 1; | |
$count += 1; | |
if ( 1 == $count ) { | |
$class .= ' first'; | |
} | |
if ( count( $values ) == $count ) { // last round | |
$class .= ' last'; | |
if ( $free_text ) { | |
$free_text_name = sprintf( | |
'_wpcf7_%1$s_free_text_%2$s', $tag->basetype, $tag->name ); | |
$free_text_atts = array( | |
'name' => $free_text_name, | |
'class' => 'wpcf7-free-text', | |
'tabindex' => $tabindex ? $tabindex : '' ); | |
if ( wpcf7_is_posted() && isset( $_POST[$free_text_name] ) ) { | |
$free_text_atts['value'] = wp_unslash( | |
$_POST[$free_text_name] ); | |
} | |
$free_text_atts = wpcf7_format_atts( $free_text_atts ); | |
$item .= sprintf( ' <input type="text" %s />', $free_text_atts ); | |
$class .= ' has-free-text'; | |
} | |
} | |
$item = '<span class="' . esc_attr( $class ) . '">' . $item . '</span>'; | |
$html .= $item; | |
} | |
$atts = wpcf7_format_atts( $atts ); | |
$html = sprintf( | |
'<span class="wpcf7-form-control-wrap %1$s"><span %2$s>%3$s</span>%4$s</span>', | |
sanitize_html_class( $tag->name ), $atts, $html, $validation_error ); | |
return $html; | |
} | |
// END CF7 override | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Allows to create a markup like this :
so it's both semantic and accessible (and styleable)