all_settings = get_option( 'wf_address_autocomplete_validation_settings' ); if ( defined( 'WC_VERSION' ) && version_compare( WC_VERSION, '3.0', '<' ) ) { add_filter( 'woocommerce_before_checkout_billing_form', array( $this, 'wf_address_autocomplete_validation_fields' ) ); } else { // Add autocomplete field to classic checkout page. add_filter( 'woocommerce_checkout_fields', array( $this, 'wf_address_autocomplete_validation_fields_create' ) ); add_filter( 'woocommerce_checkout_fields', array( $this, 'wf_address_autocomplete_validation_fields_arrange' ) ); // Add autocomplete field to block based checkout page. $this->elex_register_block_autocomplete_fields(); } add_action( 'wp_footer', array( $this, 'wf_address_autocomplete_validation_scripts' ) ); add_action( 'woocommerce_after_order_notes', array( $this, 'wf_address_autocomplete_validation_rdi_field' ) ); add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'wf_address_autocomplete_validation_rdi_update_order_meta' ) ); add_action( 'woocommerce_admin_order_data_after_billing_address', array( $this, 'wf_address_autocomplete_validation_rdi_display_admin_order_meta' ), 10, 1 ); } /** * Add RDI field to the checkout. * * @param string $checkout RDI settings. **/ public function wf_address_autocomplete_validation_rdi_field( $checkout ) { woocommerce_form_field( 'address_rdi', array( 'type' => 'text', 'class' => array( 'my-field-class form-row-wide' ), 'required' => false, ), $checkout->get_value( 'address_rdi' ) ); } /** * Update the order meta with RDI field value * * @param number $order_id Order id. */ public function wf_address_autocomplete_validation_rdi_update_order_meta( $order_id ) { if ( ! ( isset( $_POST['woocommerce-process-checkout-nonce'] ) || wp_verify_nonce( sanitize_key( $_POST['woocommerce-process-checkout-nonce'] ) ) ) ) { return false; } if ( ! empty( $_POST['address_rdi'] ) ) { $order_details = wc_get_order( $order_id ); $order_details->update_meta_data( 'RDI', sanitize_text_field( wp_unslash( $_POST['address_rdi'] ) ) ); $order_details->save(); } } /** * Display RDI field value on the order edit page * * @param string $order Order. */ public function wf_address_autocomplete_validation_rdi_display_admin_order_meta( $order ) { $wf_order_id = ( defined( 'WC_VERSION' ) && version_compare( WC_VERSION, '3.0', '<' ) ) ? $order->id : $order->get_id(); echo '

' . esc_html_e( 'Delivery Indicator' ) . ': ' . esc_html( $order->get_meta( 'RDI', true ) ) . '

'; } /** * To create two new address autocomplete fields in woocommerce version less than 3.0 * * @param number $checkout_fields Checkout fields. */ public function wf_address_autocomplete_validation_fields( $checkout_fields ) { $label = ( $this->all_settings['wf_address_autocomplete_validation_label_name'] ) ? $this->all_settings['wf_address_autocomplete_validation_label_name'] : 'Address Autocomplete'; foreach ( $checkout_fields->checkout_fields['billing'] as $key => $value ) { $temp_billing_fields[ $key ] = $value; if ( 'billing_phone' === $key ) { $temp_billing_fields['billing_autocomplete'] = array( 'label' => $label, 'placeholder' => _x( 'Search for address', 'placeholder', 'woocommerce' ), 'required' => false, 'class' => array( 'form-row-wide' ), 'clear' => true, ); } } $checkout_fields->checkout_fields['billing'] = $temp_billing_fields; foreach ( $checkout_fields->checkout_fields['shipping'] as $key => $value ) { $temp_shipping_fields[ $key ] = $value; if ( 'shipping_company' === $key ) { $temp_shipping_fields['shipping_autocomplete'] = array( 'label' => $label, 'placeholder' => _x( 'Search for address', 'placeholder', 'woocommerce' ), 'required' => false, 'class' => array( 'form-row-wide' ), 'clear' => true, ); } } $checkout_fields->checkout_fields['shipping'] = $temp_shipping_fields; return $checkout_fields; } /** To create two new address autocomplete fields * * @param array $fields Checkout page fields. */ public function wf_address_autocomplete_validation_fields_create( $fields ) { $label = ! empty( $this->all_settings['wf_address_autocomplete_validation_label_name'] ) ? $this->all_settings['wf_address_autocomplete_validation_label_name'] : __( 'Address Autocomplete', 'address-validation-address-auto-complete' ); $is_editable = get_option( 'wf_address_autocomplete_validation_settings' )['wf_address_autocomplete_validation_enable_disable_autocomplete_fields']; if ( 'yes' === $is_editable ) { $is_required = false; } else { $is_required = true; } $fields['billing']['billing_autocomplete'] = array( 'label' => $label, 'placeholder' => _x( 'Search for address', 'placeholder', 'woocommerce' ), 'required' => $is_required, 'class' => array( 'form-row-wide' ), 'clear' => true, ); $fields['shipping']['shipping_autocomplete'] = array( 'label' => $label, 'placeholder' => _x( 'Search for address', 'placeholder', 'woocommerce' ), 'required' => $is_required, 'class' => array( 'form-row-wide' ), 'clear' => true, ); return $fields; } /** To rearrange the input fields, bug - reshift country manually using array. * * @param array $fields Checkout page fields. */ public function wf_address_autocomplete_validation_fields_arrange( $fields ) { $billing_order = array( 'billing_first_name', 'billing_last_name', 'billing_company', 'billing_autocomplete', 'billing_email', 'billing_phone', 'billing_address_1', 'billing_address_2', 'billing_city', 'billing_state', 'billing_postcode', 'billing_country', ); // This sets the billing fields in the order above. foreach ( $billing_order as $billing_field ) { if ( ! isset( $fields['billing'][ $billing_field ] ) ) { continue; } $billing_fields[ $billing_field ] = $fields['billing'][ $billing_field ]; unset( $fields['billing'][ $billing_field ] ); } $remaining_fields_billing = array(); if ( ! empty( $fields['billing'] ) ) { $remaining_fields_billing = $fields['billing']; $fields['billing'] = array_merge( $billing_fields, $remaining_fields_billing ); } else { $fields['billing'] = $billing_fields; } $shipping_order = array( 'shipping_first_name', 'shipping_last_name', 'shipping_company', 'shipping_autocomplete', 'shipping_address_1', 'shipping_address_2', 'shipping_city', 'shipping_state', 'shipping_postcode', 'shipping_country', ); // This sets the shipping fields in the order above. foreach ( $shipping_order as $shipping_field ) { if ( ! isset( $fields['shipping'][ $shipping_field ] ) ) { continue; } $shipping_fields[ $shipping_field ] = $fields['shipping'][ $shipping_field ]; unset( $fields['shipping'][ $shipping_field ] ); } $remaining_fields_shipping = array(); if ( ! empty( $fields['shipping'] ) ) { $remaining_fields_shipping = $fields['shipping']; $fields['shipping'] = array_merge( $shipping_fields, $remaining_fields_shipping ); } else { $fields['shipping'] = $shipping_fields; } return $fields; } /** To add the necessary js scripts and css styles */ public function wf_address_autocomplete_validation_scripts() { // check if checkout page has block based or classic $is_checkout_block = class_exists( 'WC_Blocks_Utils' ) ? WC_Blocks_Utils::has_block_in_page( wc_get_page_id( 'checkout' ), 'woocommerce/checkout' ) : false; $selected_autocomplete_api = isset( $this->all_settings['wf_address_autocomplete_restriction'] ) ? $this->all_settings['wf_address_autocomplete_restriction'] : 'none'; if ( 'google' === $selected_autocomplete_api ) { if ( is_checkout() && ! is_order_received_page() ) { if ( $is_checkout_block ) { wp_enqueue_script( 'wf-address-google-autocomplete-handler-script', plugins_url( '../assests/js/google_block_checkout_api.js', __FILE__ ), array( 'jquery' ), '1.4.8', true ); } else { wp_enqueue_script( 'wf-address-google-autocomplete-handler-script', plugins_url( '../assests/js/google_api.js', __FILE__ ), array( 'jquery' ), '1.4.8', true ); } $status_enable_disable = isset( $this->all_settings['wf_address_autocomplete_validation_enable_disable_autocomplete_fields'] ) ? $this->all_settings['wf_address_autocomplete_validation_enable_disable_autocomplete_fields'] : 'yes'; $auto_complete_status = isset( $this->all_settings['wf_address_autocomplete_validation_availability'] ) ? $this->all_settings['wf_address_autocomplete_validation_availability'] : 'all'; $auto_complete_country = isset( $this->all_settings['wf_address_autocomplete_validation_countries_availabilty'] ) ? $this->all_settings['wf_address_autocomplete_validation_countries_availabilty'] : array(); $restrict_street_line = isset( $this->all_settings['wf_aac_enable_restrict_street_checkout'] ) ? $this->all_settings['wf_aac_enable_restrict_street_checkout'] : 'no'; $vars = array( 'status_enable_disable' => $status_enable_disable, 'auto_complete_restrict_status' => $auto_complete_status, 'auto_complete_country_allowed' => $auto_complete_country, 'restrict_street_line' => $restrict_street_line, 'address_autocomplete_field' => 'default', /** * Filter hook to put door no after street name * * @since 2.0.2 */ 'street_address_behaviour' => apply_filters( 'elex_address_autocomplete_street_address', 10 ), ); wp_localize_script( 'wf-address-google-autocomplete-handler-script', 'result', $vars ); wp_enqueue_script( 'wf-address-google-script', 'https://maps.googleapis.com/maps/api/js?key=' . $this->all_settings['wf_address_autocomplete_validation_google_api_key'] . '&libraries=places&callback=initAutocomplete&language=en-US', array( 'jquery' ), '1.4.8', true ); } } } // Register autocomplete field for block based checkout page. public function elex_register_block_autocomplete_fields() { if ( ! function_exists( 'woocommerce_register_additional_checkout_field' ) ) { return; } $label = ! empty( $this->all_settings['wf_address_autocomplete_validation_label_name'] ) ? $this->all_settings['wf_address_autocomplete_validation_label_name'] : 'Address Autocomplete'; // below function creates both Billing and Shipping inputs fields woocommerce_register_additional_checkout_field( array( 'id' => 'wf-address/autocomplete', 'label' => $label, 'location' => 'address', 'required' => false, ) ); } }