plugin = $plugin; $this->hooks(); } /** * */ protected function hooks() { add_filter( 'woocommerce_localisation_address_formats', array( $this, 'woocommerce_localisation_address_formats_filter' ), self::HOOK_PRIORITY_LAST ); add_filter( 'woocommerce_formatted_address_replacements', array( $this, 'woocommerce_formatted_address_replacements' ), self::HOOK_PRIORITY_LAST, 2 ); add_filter( 'woocommerce_order_formatted_billing_address', array( $this, 'woocommerce_order_formatted_billing_address' ), self::HOOK_PRIORITY_LAST, 2 ); add_filter( 'woocommerce_order_formatted_shipping_address', array( $this, 'woocommerce_order_formatted_shipping_address' ), self::HOOK_PRIORITY_LAST, 2 ); // addresses in my account add_filter( 'woocommerce_my_account_my_address_formatted_address', array( $this, 'woocommerce_my_account_my_address_formatted_address' ), 10, 3 ); add_action( 'woocommerce_billing_fields', array($this, 'woocommerce_billing_fields'), 19999 ); add_action( 'woocommerce_shipping_fields', array($this, 'woocommerce_shipping_fields'), 19999 ); add_action( 'woocommerce_email_customer_details', array( $this, 'woocommerce_email_customer_details_start' ), 10 ); add_action( 'woocommerce_email_customer_details', array( $this, 'woocommerce_email_customer_details_end' ), 10000 ); // additional fields add_action( 'woocommerce_thankyou', array( $this, 'additional_information_fields' ), 75 ); add_action( 'woocommerce_email_order_meta', array( $this, 'email_additional_information_fields' ), 195 ); add_action( 'woocommerce_view_order', array( $this, 'additional_information_fields' ), 195 ); add_action( 'woocommerce_edit_account_form', array( $this, 'woocommerce_edit_account_form' ) ); } public function woocommerce_edit_account_form() { } public function email_additional_information_fields( $order ) { $this->in_email_address = true; $this->additional_information_fields( wpdesk_get_order_id( $order ) ); $this->in_email_address = false; } /** * Displays additional fields. * * @param int $order_id Order id. */ public function additional_information_fields( $order_id ) { $settings = $this->plugin->getCheckoutFields( $this->plugin->get_settings() ); $checkout_field_type = $this->plugin->get_fields(); if ( ! empty( $settings ) && is_array( $settings ) ) { $return = array(); foreach ( $settings as $key => $type ) { if ( in_array( $key, array( 'billing', 'shipping' ), true ) ) { continue; } if ( isset( $type ) && is_array( $type ) ) { foreach ( $type as $field ) { if ( isset( $field['visible'] ) && 0 === intval( $field['visible'] ) && isset( $field['custom_field'] ) && 1 === intval( $field['custom_field'] ) ) { $value = wpdesk_get_order_meta( $order_id, '_' . $field['name'], true ); if ( $this->is_field_displayable( $field ) && '' !== $value ) { if ( ! empty( $checkout_field_type[ $field['type'] ]['has_options'] ) ) { $options = $field['options']; if ( isset( $options[ $value ] ) ) { $value = $options[ $value ]; } } $value = apply_filters( 'flexible_checkout_fields_print_value', $value, $field ); if ( '' !== $value ) { $return[] = strip_tags( wpdesk__( $field['label'], 'flexible-checkout-fields' ) ) . ': ' . esc_html( $value ); } } } } } } if ( count( $return ) > 0 ) { echo '
'; echo '

' . __( 'Additional Information', 'flexible-checkout-fields' ) . '

'; echo '

' . implode( '
', $return ) . '

'; echo '
'; } } } public function woocommerce_email_customer_details_start() { $this->in_email_address = true; } public function woocommerce_email_customer_details_end() { $this->in_email_address = false; } public function woocommerce_my_account_my_address_formatted_address( $address, $customer_id, $address_type ) { $checkout_field_type = $this->plugin->get_fields(); $this->current_address_type = $address_type; WC()->countries->address_formats = ''; $cf_fields = $this->getCheckoutFields( array(), $address_type ); $is_empty_address = $this->check_if_address_is_empty ( $address ); foreach ( $cf_fields as $field_key => $field ) { $fcf_field = new Flexible_Checkout_Fields_Field( $field, $this->plugin); if ( !isset( $address[$field['name']] ) ) { $val = ''; if ( $fcf_field->is_custom_field() && $fcf_field->get_display_on_option_show_label() === '1' ) { $val .= strip_tags( wpdesk__( $field['label'], 'flexible-checkout-fields' ) ) . ': '; } $meta_value = get_user_meta( $customer_id, $field_key, true ); $meta_value = apply_filters( 'flexible_checkout_fields_user_meta_display_value', $meta_value, $field ); $val .= $meta_value; if ( $is_empty_address && ( $meta_value === '' ) ) { $val = ''; } $address[$field['name']] = $val; $address[$this->replace_only_first( $address_type . '_', '', $field['name'] )] = $val; } } return $address; } public function getCheckoutFields( $fields, $request_type = null ) { return $this->plugin->getCheckoutFields( $fields, $request_type ); } /** * Checks if all values in address array are empty. * * @param string[] $address Array keys are field names and values are field values. * * @return bool Status if all values are empty string. */ private function check_if_address_is_empty( array $address ) { foreach ( $address as $field_key => $field_value ) { if ( $field_value !== '' ) { return false; } } return true; } /** * Append field to address format. * * @param string $format * @param string $field_key * @param array $field * * @return string */ private function append_field_to_address_format( $format, $field_key, $field ) { if ( ( $this->is_thankyou_page() || $this->is_in_email() || $this->is_order_page() ) && in_array( $field_key, array( 'billing_phone', 'billing_email' ) ) ) { return $format; } $fcf_field = new Flexible_Checkout_Fields_Field( $field, $this->plugin ); if ( isset( $field['type'] ) && in_array( $field['type'], array( 'heading', 'info', 'paragraph', 'image' ) ) ) { return $format; } if ( $this->is_field_displayable( $field ) ) { if ( $format != '' ) { if ( $fcf_field->get_display_on_option_new_line_before() === '1' ) { $format .= "\n"; } elseif ( ! $fcf_field->get_display_comma_before() ) { $format .= ' '; } } if ( $fcf_field->get_display_comma_before() ) { $format .= ', '; } $field_name = $fcf_field->get_name_for_address_format(); $format .= '{' . $this->replace_only_first( $this->current_address_type . '_', '', $field_name . '}' ); } return $format; } /** * Localisation address formats - woocommerce filter. * * @param array $formats * * @return array */ public function woocommerce_localisation_address_formats_filter( $formats ) { $fields = $this->getCheckoutFields( array(), $this->current_address_type ); if ( empty( $fields ) ) { return $formats; } foreach ( $formats as $format_key => $format ) { if ( $this->is_edit_address_page() || $this->is_order_page() || $this->is_in_email() || $this->is_thankyou_page() ) { $formats[ $format_key ] = ''; foreach ( $fields as $field_key => $field ) { $formats[ $format_key ] = $this->append_field_to_address_format( $formats[ $format_key ], $field_key, $field ); } } } return $formats; } private function is_field_displayable( $field ) { $displayable = true; $fcf_field = new Flexible_Checkout_Fields_Field( $field, $this->plugin ); if ( $this->is_edit_address_page() ) { $displayable = !isset( $field[self::DISPLAY_ON_ADDRESS] ) || $field[self::DISPLAY_ON_ADDRESS] == '1'; if ( $fcf_field->is_field_excluded_for_user() ) { $displayable = false; } } if ( $this->is_order_page() ) { $displayable = !isset( $field[self::DISPLAY_ON_ORDER] ) || $field[self::DISPLAY_ON_ORDER] == '1'; } if ( $this->is_in_email() ) { $displayable = !isset( $field[self::DISPLAY_ON_EMAILS] ) || $field[self::DISPLAY_ON_EMAILS] == '1'; } if ( $this->is_thankyou_page() ) { $displayable = !isset( $field[self::DISPLAY_ON_THANK_YOU] ) || $field[self::DISPLAY_ON_THANK_YOU] == '1'; } return $displayable; } public function is_admin_edit_order() { $admin_edit_order = false; if ( is_admin() ) { $admin_edit_order = true; } return $admin_edit_order; } public function is_edit_address_page() { global $wp; $edit_address_page = false; if ( is_account_page() ) { if ( isset( $wp->query_vars['edit-address'] ) ) { $edit_address_page = true; } } return $edit_address_page; } public function is_order_page() { global $wp; $order_page = false; if ( is_account_page() ) { if ( isset( $wp->query_vars['view-order'] ) ) { $order_page = true; } } return $order_page; } public function is_in_email() { $in_email = false; if ( $this->in_email_address ) { $in_email = true; } return $in_email; } public function is_thankyou_page() { global $wp; $thankyou_page = false; if ( is_checkout() ) { if ( isset( $wp->query_vars['order-received'] ) ) { $thankyou_page = true; } } return $thankyou_page; } public function woocommerce_formatted_address_replacements( $fields, $args ) { foreach ( $args as $arg_key => $arg ) { if ( !isset( $fields['{' . $arg_key . '}'] ) ) { $fields['{' . $arg_key . '}'] = $arg; } } return $fields; } public function woocommerce_order_formatted_billing_address( $fields, $order ) { $this->current_address_type = 'billing'; WC()->countries->address_formats = ''; return $this->woocommerce_order_formatted_address( $fields, $order, 'billing' ); } /** * @param array $fields * @param WC_Order $order * @param string $address_type * * @return mixed */ public function woocommerce_order_formatted_address( $fields, $order, $address_type ) { $cf_fields = $this->getCheckoutFields( array(), $address_type ); $checkout_field_type = $this->plugin->get_fields(); foreach ( $cf_fields as $field_key => $field ) { $val = wpdesk_get_order_meta( $order, '_' . $field_key, true ); if ( empty( $val ) && isset( $fields[ $field_key ] ) ) { $val = $fields[ $field_key ]; } $fcf_field = new Flexible_Checkout_Fields_Field( $field, $this->plugin ); if ( (isset( $field['custom_field'] ) && $field['custom_field'] == '1')) { $val = ''; if ( $fcf_field->is_custom_field() && $fcf_field->get_display_on_option_show_label() === '1' ) { $val = strip_tags( wpdesk__( $field['label'], 'flexible-checkout-fields' ) ) . ': '; } $meta_value = wpdesk_get_order_meta( $order, '_' . $field_key, true ); $meta_value = apply_filters( 'flexible_checkout_fields_print_value', $meta_value, $field ); $val .= $meta_value; } $val = $this->flexible_invoices_ask_field_integration($val, $field, $field_key, $fields); $val = wp_kses_post( $val ); $fields[$field['name']] = $val; $fields[$this->replace_only_first( $address_type . '_', '', $field['name'] )] = $val; } return $fields; } /** * Similar to str_replace but replaces only the first occurrence. * * @param string $needle search for it. * @param string $replace change the needle to this value. * @param string $haystack here we are searching * * @return string */ private function replace_only_first($needle, $replace, $haystack) { $pos = strpos($haystack, $needle); if ($pos !== false) { return substr_replace($haystack, $replace, $pos, strlen($needle)); } return $haystack; } /** * Return value for invoice ask field prepared by FI plugin. If can't then fallback. * * @param string $val Prepared by FCF field value. * @param array $field FCF field def. * @param string $field_key Field key that is currently processed. Needed to check if val should be replaced. * @param array $fields Prepared by WC field values * * @return string New field value */ private function flexible_invoices_ask_field_integration( $val, $field, $field_key, $fields ) { if ( apply_filters( 'flexible_checkout_fields_invoices_integration_enabled', true ) ) { // FI ask field integration if ( $field_key === 'invoice_ask' && ! empty( $fields['invoice_ask_field'] ) ) { return $fields['invoice_ask_field']; } // wFirma/Fakturownia/iFirma/inFakt ask field integration $supported_ask_fields = array( 'billing_faktura', 'billing_invoice', 'billing_rachunek' ); if ( in_array( $field_key, $supported_ask_fields, true ) ) { $wc_meta_key_definitions = apply_filters( 'woocommerce_customer_meta_fields', [] ); $label = strip_tags( wpdesk__( $field['label'], 'flexible-checkout-fields' ) ); // original plugin is probably(?) disabled if the field is not accessible if ( isset( $wc_meta_key_definitions[ $this->current_address_type ]['fields'][ $field_key ] ) ) { $wc_field_def = $wc_meta_key_definitions[ $this->current_address_type ]['fields'][ $field_key ]; // if field exists and is defined as select we can use this data. If not then better do not touch as it's probably optional checkbox if ( isset( $wc_field_def['options'] ) ) { $select_options = $wc_meta_key_definitions[ $this->current_address_type ]['fields'][ $field_key ]['options']; $option_val = isset( $select_options[ $val ] ) ? $select_options[ $val ] : ''; return $label . ': ' . $option_val; } elseif ( (int) $val === 1 ) { return $label; } } } } return $val; } /** * Mainly injects FCF data values into WC formatted shipping address. * Also changes current_address_type indicator and do some shady stuff to WC()->countries. * * @param array|string $fields Fields can be string when shipment is disabled * @param WC_Order $order * * @return array|string */ public function woocommerce_order_formatted_shipping_address( $fields, $order ) { $this->current_address_type = 'shipping'; WC()->countries->address_formats = ''; if ( ! is_array( $fields ) ) { return $fields; } return $this->woocommerce_order_formatted_address( $fields, $order, 'shipping' ); } public function woocommerce_billing_fields( $fields ) { return $this->woocommerce_fields( $fields, 'billing' ); } public function woocommerce_shipping_fields( $fields ) { return $this->woocommerce_fields( $fields, 'shipping' ); } protected function woocommerce_fields( $fields, $section ) { global $wp; $cf_fields = $this->getCheckoutFields( array(), $section ); $edit_address_page = false; if ( is_account_page() ) { if ( isset( $wp->query_vars['edit-address'] ) ) { $edit_address_page = true; } } foreach ( $cf_fields as $cf_field_key => $cf_field ) { $remove_field = false; if ( $edit_address_page ) { $remove_field = true; if ( !isset( $cf_field[self::DISPLAY_ON_ADDRESS] ) || $cf_field[self::DISPLAY_ON_ADDRESS] == '1' ) { $remove_field = false; } } if ( $remove_field ) { unset( $fields[$cf_field_key] ); } } return $fields; } }