Add new text checkout field
Here is an example of how to add an additional text field ‘new_field’ into the checkout form:
add_filter('babe_checkout_args', 'customtheme_babe_checkout_args', 10, 2); /** * Add checkout text field */ function customtheme_babe_checkout_args( $args_meta, $args ) { $args_meta['new_field'] = $args['meta']['new_field'] ?? ''; return $args_meta; } //////// add_filter('babe_checkout_field_label', 'customtheme_babe_checkout_field_label', 10, 2); /** * Add checkout field title */ function customtheme_babe_checkout_field_label( $field_title, $field_name ) { if ($field_name === 'new_field'){ $field_title = __('Field Title', 'textdomain'); } return $field_title; } //////// add_filter('babe_checkout_field_required', 'customtheme_babe_checkout_field_required', 10, 2); /** * Required tag for checkout field. Use it only if you need to make field required */ function customtheme_babe_checkout_field_required($required_tag, $field_name){ if ($field_name === 'new_field'){ $required_tag = 'required="required"'; } return $required_tag; } /////////////////// add_filter('babe_sanitize_checkout_vars', 'customtheme_sanitize_checkout_vars', 10, 2); /** * Add fields to sanitize checkout vars method */ function customtheme_sanitize_checkout_vars( $output, $arr ) { $output['new_field'] = isset($arr['new_field']) ? sanitize_text_field($arr['new_field']) : ''; return $output; }
Add another field types: radio, checkbox and select
The next snippet can be used as an example for custom radio, checkbox and select fields:
function customtheme_get_hotels(){ return [ 'hotel1' => __('Hotel name 1', 'textdomain'), 'hotel2' => __('Hotel name 2', 'textdomain'), 'hotel3' => __('Hotel name 3', 'textdomain'), 'hotel4' => __('Hotel name 4', 'textdomain'), 'hotel5' => __('Hotel name 5', 'textdomain'), ]; } function customtheme_get_radios(){ return [ 'radio1' => __('Radio value 1', 'textdomain'), 'radio2' => __('Radio value 2', 'textdomain'), ]; } add_filter('babe_checkout_field_label', 'customtheme_babe_checkout_field_label', 10, 2); function customtheme_babe_checkout_field_label( $field_title, $field_name ) { if ( $field_name === 'checkbox' ){ $field_title = __( 'Checkbox title', 'textdomain' ); } if ( $field_name === 'radio' ){ $field_title = __( 'Radio title', 'textdomain' ); } if ( $field_name === 'hotel' ){ $field_title = __( 'Hotel', 'textdomain' ); } return $field_title; } add_filter('babe_checkout_after_contact_fields', 'customtheme_add_fields', 10, 2); function customtheme_add_fields( $output, $args ){ $hotels = customtheme_get_hotels(); $radios = customtheme_get_radios(); $hotels_options = '<option value>'.__( 'Select...', 'textdomain' ).'</option>'; $hotel = !empty($args['meta']['hotel']) ? $args['meta']['hotel'] : ''; foreach( $hotels as $hotel_code => $hotel_name){ $hotels_options .= '<option value="'.esc_attr($hotel_code).'" '.selected($hotel, $hotel_code,false).'>'.esc_html($hotel_name).'</option>'; } $radio_value = !empty($args['meta']['radio']) ? $args['meta']['radio'] : ''; $checkbox_value = !empty($args['meta']['checkbox']) ? 1 : 0; $output .= '<h3>'. __( 'Checkbox and Hotel', 'textdomain' ) .'</h3>'; $output .= '<div class="address_fields_group input_group"> <div class="checkout-form-block checkout_select_block"> <div class="checkout_select_title"> <div class="checkout_checkbox_wrapper checkout_form_input_field_content"> <input type="checkbox" class="checkout_form_input_field_checkbox" name="checkbox" id="checkbox" value="1" '. checked($checkbox_value, 1, false) . ' > <label for="checkbox">'. BABE_html::checkout_field_label('checkbox') .'</label> </div> </div> </div> <div class="checkout-form-block checkout_select_block"> <div class="checkout_select_title"> <div class="checkout_select_wrapper checkout_form_input_field_content"> <label class="checkout_form_input_label">' . BABE_html::checkout_field_label('hotel') . '</label> <select class="checkout_select_field select2" name="hotel" id="hotel">'.$hotels_options.'</select> </div> </div> </div> <div class="checkout-form-block checkout_select_block"> <div class="checkout_select_title"> <div class="checkout_radio_wrapper checkout_form_input_field_content"> <label class="checkout_form_input_label">' . BABE_html::checkout_field_label('radio') . '</label>'; foreach( $radios as $radio_code => $radio_name){ $radio_value = empty($radio_value) ? $radio_code : $radio_value; $output .= '<div class="checkout_form_input_field_radio_wrapper"> <input type="radio" class="checkout_form_input_field_radio" id="'.sanitize_key($radio_code).'" name="radio" value="'.esc_attr($radio_code).'" '. checked($radio_value, $radio_code, false) . ' > <label for="'.sanitize_key($radio_code).'">'. esc_html($radio_name) .'</label> </div>'; } $output .= ' </div> </div> </div> </div>'; return $output; } add_filter('babe_sanitize_checkout_vars', 'customtheme_sanitize_checkout_vars', 10, 2); function customtheme_sanitize_checkout_vars( $output, $arr ) { $hotels = customtheme_get_hotels(); $radios = customtheme_get_radios(); $output['checkbox'] = !empty($arr['checkbox']) ? 1 : 0; $output['radio'] = isset($arr['radio'], $radios[$arr['radio']]) ? $arr['radio'] : ''; $output['hotel'] = isset($arr['hotel'], $hotels[$arr['hotel']]) ? $arr['hotel'] : ''; return $output; } add_filter('babe_order_customer_details_fields', 'customtheme_customer_details_fields', 10, 2); function customtheme_customer_details_fields($order_meta, $order_id){ $order_meta['checkbox'] = !empty($order_meta['checkbox']) ? __( 'yes', 'textdomain' ) : __( 'no', 'textdomain' ); $hotels = customtheme_get_hotels(); if ( !empty($order_meta['hotel']) && isset($hotels[ $order_meta['hotel'] ]) ){ $order_meta['hotel'] = $hotels[ $order_meta['hotel'] ]; } $radios = customtheme_get_radios(); if ( !empty($order_meta['radio']) && isset($radios[ $order_meta['radio'] ]) ){ $order_meta['radio'] = $radios[ $order_meta['radio'] ]; } return $order_meta; } add_action( 'cmb2_admin_init', 'customtheme_order_customer_extra_fields', 20, 1); function customtheme_order_customer_extra_fields() { $hotels = customtheme_get_hotels(); $radios = customtheme_get_radios(); $cmb = new_cmb2_box( array( 'id' => 'order_customer_extra_fields', 'title' => __( 'Extra fields', 'textdomain' ), 'object_types' => array( BABE_Post_types::$order_post_type, ), // Post type 'context' => 'normal', 'priority' => 'high', 'show_names' => true, ) ); $cmb->add_field( array( 'name' => BABE_html::checkout_field_label('checkbox'), 'id' => 'checkbox', 'type' => 'checkbox', ) ); $cmb->add_field( array( 'name' => BABE_html::checkout_field_label('radio'), 'id' => 'radio', 'type' => 'radio', 'options' => $radios, ) ); $cmb->add_field( array( 'name' => BABE_html::checkout_field_label('hotel'), 'id' => 'hotel', 'type' => 'select', 'show_option_none' => true, 'options' => $hotels, ) ); }