* @since 1.0.0
*/
add_action( 'wpcf7_init', 'cf7bs_addshrtd_checkbox', 11 );
function cf7bs_addshrtd_checkbox() {
$add_func = function_exists( 'wpcf7_add_form_tag' ) ? 'wpcf7_add_form_tag' : 'wpcf7_add_shrtd';
$remove_func = function_exists( 'wpcf7_remove_form_tag' ) ? 'wpcf7_remove_form_tag' : 'wpcf7_remove_shortcode';
$tags = array(
'checkbox',
'checkbox*',
'radio',
);
foreach ( $tags as $tag ) {
call_user_func( $remove_func, $tag );
}
call_user_func( $add_func, $tags, 'cf7bs_checkbox_shortcode_handler', true );
}
function cf7bs_checkbox_shortcode_handler( $tag ) {
$classname = class_exists( 'WPCF7_FormTag' ) ? 'WPCF7_FormTag' : 'WPCF7_Shortcode';
$tag_obj = new $classname( $tag );
if ( empty( $tag_obj->name ) ) {
return '';
}
$mode = $status = 'default';
$validation_error = wpcf7_get_validation_error( $tag_obj->name );
$class = wpcf7_form_controls_class( $tag_obj->type );
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
$status = 'error';
}
$exclusive = $tag_obj->has_option( 'exclusive' );
$free_text = $tag_obj->has_option( 'free_text' );
$multiple = false;
if ( 'checkbox' == $tag_obj->basetype ) {
$multiple = !$exclusive;
} else {
$exclusive = false;
}
if ( $exclusive ) {
$class .= ' wpcf7-exclusive-checkbox';
}
if ( $tag_obj->is_required() ) {
$mode = 'required';
}
$values = (array) $tag_obj->values;
$labels = (array) $tag_obj->labels;
if ( $data = (array) $tag_obj->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_obj->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_obj->get_first_match_option( '/^default:([0-9_]+)$/' ) ) {
$defaults = array_merge( $defaults, explode( '_', $matches[1] ) );
}
$defaults = array_unique( $defaults );
$options = array();
$checked = '';
if ( $multiple ) {
$checked = array();
}
if ( isset( $_POST[ $tag_obj->name ] ) ) {
$post = $_POST[ $tag_obj->name ];
} else {
if ( isset( $_GET[ $tag_obj->name ] ) ) {
if ( $multiple ) {
$get = cf7bs_array_decode( rawurldecode( $_GET[ $tag_obj->name ] ) );
} else {
$get = rawurldecode( $_GET[ $tag_obj->name ] );
}
}
$post = $multiple ? array() : '';
}
$posted = wpcf7_is_posted();
$count = 0;
$replace_index = count( (array) $tag_obj->values ) - 1;
foreach ( (array) $tag_obj->values as $key => $value ) {
$options[ $value ] = isset( $labels[ $key ] ) ? $labels[ $key ] : $value;
if ( $free_text && $count == $replace_index ) {
$options[ $value ] .= ' ';
}
if ( $posted && ! empty( $post ) ) {
if ( $multiple && in_array( esc_sql( $value ), (array) $post ) ) {
$checked[] = $value;
}
if ( ! $multiple && $post == esc_sql( $value ) ) {
$checked = $value;
}
} elseif ( isset( $get ) && ! empty( $get ) ) {
if ( $multiple && in_array( esc_sql( $value ), (array) $get ) ) {
$checked[] = $value;
}
if ( ! $multiple && $get == esc_sql( $value ) ) {
$checked = $value;
}
} elseif ( in_array( $key + 1, (array) $defaults ) ) {
if ( $multiple ) {
$checked[] = $value;
} else {
$checked = $value;
}
}
$count++;
}
$label = $tag_obj->content;
if ( count( $options ) < 1 ) {
if ( $free_text ) {
$options = array( 'true' => '' );
} else {
$options = array( 'true' => $label );
$label = '';
}
}
$field = new CF7BS_Form_Field( cf7bs_apply_field_args_filter( array(
'name' => $tag_obj->name,
'id' => $tag_obj->get_option( 'id', 'id', true ),
'class' => '',
'type' => $tag_obj->basetype,
'value' => $checked,
'label' => $label,
'options' => $options,
'help_text' => $validation_error,
'size' => cf7bs_get_form_property( 'size', 0, $tag_obj ),
'grid_columns' => cf7bs_get_form_property( 'grid_columns', 0, $tag_obj ),
'form_layout' => cf7bs_get_form_property( 'layout', 0, $tag_obj ),
'form_label_width' => cf7bs_get_form_property( 'label_width', 0, $tag_obj ),
'form_breakpoint' => cf7bs_get_form_property( 'breakpoint', 0, $tag_obj ),
'group_layout' => cf7bs_get_form_property( 'group_layout', 0, $tag_obj ),
'group_type' => cf7bs_get_form_property( 'group_type', 0, $tag_obj ),
'mode' => $mode,
'status' => $status,
'tabindex' => $tag_obj->get_option( 'tabindex', 'int', true ),
'wrapper_class' => $tag_obj->get_class_option( $class . ' ' . $tag_obj->name ),
'label_class' => $tag_obj->get_option( 'label_class', 'class', true ),
), $tag_obj->basetype, $tag_obj->name ) );
$html = $field->display( false );
return $html;
}