<?php defined('ABSPATH') || exit; class WC_Countries { public $locale = array(); public $address_formats = array(); public function __get($key) { if ('countries' === $key) { return $this->get_countries(); } elseif ('states' === $key) { return $this->get_states(); } } public function get_countries() { if (empty($this->countries)) { $this->countries = apply_filters('woocommerce_countries', include WC()->plugin_path() . '/i18n/countries.php'); if (apply_filters('woocommerce_sort_countries', true)) { wc_asort_by_locale($this->countries); } } return $this->countries; } public function country_exists($country_code) { return isset($this->get_countries()[$country_code]); } public function get_continents() { if (empty($this->continents)) { $this->continents = apply_filters('woocommerce_continents', include WC()->plugin_path() . '/i18n/continents.php'); } return $this->continents; } public function get_continent_code_for_country($cc) { $cc = trim(strtoupper($cc)); $continents = $this->get_continents(); $continents_and_ccs = wp_list_pluck($continents, 'countries'); foreach ($continents_and_ccs as $continent_code => $countries) { if (false !== array_search($cc, $countries, true)) { return $continent_code; } } return ''; } public function get_country_calling_code($cc) { $codes = wp_cache_get('calling-codes', 'countries'); if (!$codes) { $codes = (include WC()->plugin_path() . '/i18n/phone.php'); wp_cache_set('calling-codes', $codes, 'countries'); } $calling_code = isset($codes[$cc]) ? $codes[$cc] : ''; if (is_array($calling_code)) { $calling_code = $calling_code[0]; } return $calling_code; } public function get_shipping_continents() { $continents = $this->get_continents(); $shipping_countries = $this->get_shipping_countries(); $shipping_country_codes = array_keys($shipping_countries); $shipping_continents = array(); foreach ($continents as $continent_code => $continent) { if (count(array_intersect($continent['countries'], $shipping_country_codes))) { $shipping_continents[$continent_code] = $continent; } } return $shipping_continents; } public function load_country_states() { global $states; $states = (include WC()->plugin_path() . '/i18n/states.php'); $this->states = apply_filters('woocommerce_states', $states); } public function get_states($cc = null) { if (!isset($this->states)) { $this->states = apply_filters('woocommerce_states', include WC()->plugin_path() . '/i18n/states.php'); } if (!is_null($cc)) { return isset($this->states[$cc]) ? $this->states[$cc] : false; } else { return $this->states; } } public function get_base_address() { $base_address = get_option('woocommerce_store_address', ''); return apply_filters('woocommerce_countries_base_address', $base_address); } public function get_base_address_2() { $base_address_2 = get_option('woocommerce_store_address_2', ''); return apply_filters('woocommerce_countries_base_address_2', $base_address_2); } public function get_base_country() { $default = wc_get_base_location(); return apply_filters('woocommerce_countries_base_country', $default['country']); } public function get_base_state() { $default = wc_get_base_location(); return apply_filters('woocommerce_countries_base_state', $default['state']); } public function get_base_city() { $base_city = get_option('woocommerce_store_city', ''); return apply_filters('woocommerce_countries_base_city', $base_city); } public function get_base_postcode() { $base_postcode = get_option('woocommerce_store_postcode', ''); return apply_filters('woocommerce_countries_base_postcode', $base_postcode); } public function get_allowed_countries() { if ('all' === get_option('woocommerce_allowed_countries')) { return apply_filters('woocommerce_countries_allowed_countries', $this->countries); } if ('all_except' === get_option('woocommerce_allowed_countries')) { $except_countries = get_option('woocommerce_all_except_countries', array()); if (!$except_countries) { return $this->countries; } else { $all_except_countries = $this->countries; foreach ($except_countries as $country) { unset($all_except_countries[$country]); } return apply_filters('woocommerce_countries_allowed_countries', $all_except_countries); } } $countries = array(); $raw_countries = get_option('woocommerce_specific_allowed_countries', array()); if ($raw_countries) { foreach ($raw_countries as $country) { $countries[$country] = $this->countries[$country]; } } return apply_filters('woocommerce_countries_allowed_countries', $countries); } public function get_shipping_countries() { if ('' === get_option('woocommerce_ship_to_countries')) { return $this->get_allowed_countries(); } if ('all' === get_option('woocommerce_ship_to_countries')) { return $this->countries; } $countries = array(); $raw_countries = get_option('woocommerce_specific_ship_to_countries'); if ($raw_countries) { foreach ($raw_countries as $country) { $countries[$country] = $this->countries[$country]; } } return apply_filters('woocommerce_countries_shipping_countries', $countries); } public function get_allowed_country_states() { if (get_option('woocommerce_allowed_countries') !== 'specific') { return $this->states; } $states = array(); $raw_countries = get_option('woocommerce_specific_allowed_countries'); if ($raw_countries) { foreach ($raw_countries as $country) { if (isset($this->states[$country])) { $states[$country] = $this->states[$country]; } } } return apply_filters('woocommerce_countries_allowed_country_states', $states); } public function get_shipping_country_states() { if (get_option('woocommerce_ship_to_countries') === '') { return $this->get_allowed_country_states(); } if (get_option('woocommerce_ship_to_countries') !== 'specific') { return $this->states; } $states = array(); $raw_countries = get_option('woocommerce_specific_ship_to_countries'); if ($raw_countries) { foreach ($raw_countries as $country) { if (!empty($this->states[$country])) { $states[$country] = $this->states[$country]; } } } return apply_filters('woocommerce_countries_shipping_country_states', $states); } public function get_european_union_countries($type = '') { $countries = array('AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK'); if ('eu_vat' === $type) { $countries[] = 'MC'; } return apply_filters('woocommerce_european_union_countries', $countries, $type); } public function countries_using_vat() { wc_deprecated_function('countries_using_vat', '4.0', 'WC_Countries::get_vat_countries'); $countries = array('AE', 'AL', 'AR', 'AZ', 'BB', 'BH', 'BO', 'BS', 'BY', 'CL', 'CO', 'EC', 'EG', 'ET', 'FJ', 'GH', 'GM', 'GT', 'IL', 'IN', 'IR', 'KN', 'KR', 'KZ', 'LK', 'MD', 'ME', 'MK', 'MN', 'MU', 'MX', 'NA', 'NG', 'NP', 'PS', 'PY', 'RS', 'RU', 'RW', 'SA', 'SV', 'TH', 'TR', 'UA', 'UY', 'UZ', 'VE', 'VN', 'ZA'); return apply_filters('woocommerce_countries_using_vat', $countries); } public function get_vat_countries() { $eu_countries = $this->get_european_union_countries(); $vat_countries = array('AE', 'AL', 'AR', 'AZ', 'BB', 'BH', 'BO', 'BS', 'BY', 'CL', 'CO', 'EC', 'EG', 'ET', 'FJ', 'GB', 'GH', 'GM', 'GT', 'IL', 'IM', 'IN', 'IR', 'KN', 'KR', 'KZ', 'LK', 'MC', 'MD', 'ME', 'MK', 'MN', 'MU', 'MX', 'NA', 'NG', 'NO', 'NP', 'PS', 'PY', 'RS', 'RU', 'RW', 'SA', 'SV', 'TH', 'TR', 'UA', 'UY', 'UZ', 'VE', 'VN', 'ZA'); return apply_filters('woocommerce_vat_countries', array_merge($eu_countries, $vat_countries)); } public function shipping_to_prefix($country_code = '') { $country_code = $country_code ? $country_code : WC()->customer->get_shipping_country(); $countries = array('AE', 'CZ', 'DO', 'GB', 'NL', 'PH', 'US', 'USAF'); $return = in_array($country_code, $countries, true) ? __('to the', 'woocommerce') : __('to', 'woocommerce'); return apply_filters('woocommerce_countries_shipping_to_prefix', $return, $country_code); } public function estimated_for_prefix($country_code = '') { $country_code = $country_code ? $country_code : $this->get_base_country(); $countries = array('AE', 'CZ', 'DO', 'GB', 'NL', 'PH', 'US', 'USAF'); $return = in_array($country_code, $countries, true) ? __('the', 'woocommerce') . ' ' : ''; return apply_filters('woocommerce_countries_estimated_for_prefix', $return, $country_code); } public function tax_or_vat() { $return = in_array($this->get_base_country(), $this->get_vat_countries(), true) ? __('VAT', 'woocommerce') : __('Tax', 'woocommerce'); return apply_filters('woocommerce_countries_tax_or_vat', $return); } public function inc_tax_or_vat() { $return = in_array($this->get_base_country(), $this->get_vat_countries(), true) ? __('(incl. VAT)', 'woocommerce') : __('(incl. tax)', 'woocommerce'); return apply_filters('woocommerce_countries_inc_tax_or_vat', $return); } public function ex_tax_or_vat() { $return = in_array($this->get_base_country(), $this->get_vat_countries(), true) ? __('(ex. VAT)', 'woocommerce') : __('(ex. tax)', 'woocommerce'); return apply_filters('woocommerce_countries_ex_tax_or_vat', $return); } public function country_dropdown_options($selected_country = '', $selected_state = '', $escape = false) { if ($this->countries) { foreach ($this->countries as $key => $value) { $states = $this->get_states($key); if ($states) { echo '<optgroup label="' . esc_attr($value) . '">'; foreach ($states as $state_key => $state_value) { echo '<option value="' . esc_attr($key) . ':' . esc_attr($state_key) . '"'; if ($selected_country === $key && $selected_state === $state_key) { echo ' selected="selected"'; } echo '>' . esc_html($value) . ' &mdash; ' . ($escape ? esc_html($state_value) : $state_value) . '</option>'; } echo '</optgroup>'; } else { echo '<option'; if ($selected_country === $key && '*' === $selected_state) { echo ' selected="selected"'; } echo ' value="' . esc_attr($key) . '">' . ($escape ? esc_html($value) : $value) . '</option>'; } } } } public function get_address_formats() { if (empty($this->address_formats)) { $this->address_formats = apply_filters('woocommerce_localisation_address_formats', array('default' => "{name}\n{company}\n{address_1}\n{address_2}\n{city}\n{state}\n{postcode}\n{country}", 'AT' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'AU' => "{name}\n{company}\n{address_1}\n{address_2}\n{city} {state} {postcode}\n{country}", 'BE' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'CA' => "{company}\n{name}\n{address_1}\n{address_2}\n{city} {state_code} {postcode}\n{country}", 'CH' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'CL' => "{company}\n{name}\n{address_1}\n{address_2}\n{state}\n{postcode} {city}\n{country}", 'CN' => "{country} {postcode}\n{state}, {city}, {address_2}, {address_1}\n{company}\n{name}", 'CZ' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'DE' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'DK' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'EE' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'ES' => "{name}\n{company}\n{address_1}\n{address_2}\n{postcode} {city}\n{state}\n{country}", 'FI' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'FR' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city_upper}\n{country}", 'HK' => "{company}\n{first_name} {last_name_upper}\n{address_1}\n{address_2}\n{city_upper}\n{state_upper}\n{country}", 'HU' => "{last_name} {first_name}\n{company}\n{city}\n{address_1}\n{address_2}\n{postcode}\n{country}", 'IN' => "{company}\n{name}\n{address_1}\n{address_2}\n{city} {postcode}\n{state}, {country}", 'IS' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'IT' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode}\n{city}\n{state_upper}\n{country}", 'JM' => "{name}\n{company}\n{address_1}\n{address_2}\n{city}\n{state}\n{postcode_upper}\n{country}", 'JP' => "{postcode}\n{state} {city} {address_1}\n{address_2}\n{company}\n{last_name} {first_name}\n{country}", 'LI' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'NL' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'NO' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'NZ' => "{name}\n{company}\n{address_1}\n{address_2}\n{city} {postcode}\n{country}", 'PL' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'PR' => "{company}\n{name}\n{address_1} {address_2}\n{city} \n{country} {postcode}", 'PT' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'RS' => "{name}\n{company}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'SE' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'SI' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'SK' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}", 'TR' => "{name}\n{company}\n{address_1}\n{address_2}\n{postcode} {city} {state}\n{country}", 'TW' => "{company}\n{last_name} {first_name}\n{address_1}\n{address_2}\n{state}, {city} {postcode}\n{country}", 'UG' => "{name}\n{company}\n{address_1}\n{address_2}\n{city}\n{state}, {country}", 'US' => "{name}\n{company}\n{address_1}\n{address_2}\n{city}, {state_code} {postcode}\n{country}", 'VN' => "{name}\n{company}\n{address_1}\n{city}\n{country}")); } return $this->address_formats; } public function get_formatted_address($args = array(), $separator = '<br/>') { $default_args = array('first_name' => '', 'last_name' => '', 'company' => '', 'address_1' => '', 'address_2' => '', 'city' => '', 'state' => '', 'postcode' => '', 'country' => ''); $args = array_map('trim', wp_parse_args($args, $default_args)); $state = $args['state']; $country = $args['country']; $formats = $this->get_address_formats(); $format = $country && isset($formats[$country]) ? $formats[$country] : $formats['default']; $full_country = isset($this->countries[$country]) ? $this->countries[$country] : $country; if ($country === $this->get_base_country() && !apply_filters('woocommerce_formatted_address_force_country_display', false)) { $format = str_replace('{country}', '', $format); } $full_state = $country && $state && isset($this->states[$country][$state]) ? $this->states[$country][$state] : $state; $replace = array_map('esc_html', apply_filters('woocommerce_formatted_address_replacements', array('{first_name}' => $args['first_name'], '{last_name}' => $args['last_name'], '{name}' => sprintf(_x('%1$s %2$s', 'full name', 'woocommerce'), $args['first_name'], $args['last_name']), '{company}' => $args['company'], '{address_1}' => $args['address_1'], '{address_2}' => $args['address_2'], '{city}' => $args['city'], '{state}' => $full_state, '{postcode}' => $args['postcode'], '{country}' => $full_country, '{first_name_upper}' => wc_strtoupper($args['first_name']), '{last_name_upper}' => wc_strtoupper($args['last_name']), '{name_upper}' => wc_strtoupper(sprintf(_x('%1$s %2$s', 'full name', 'woocommerce'), $args['first_name'], $args['last_name'])), '{company_upper}' => wc_strtoupper($args['company']), '{address_1_upper}' => wc_strtoupper($args['address_1']), '{address_2_upper}' => wc_strtoupper($args['address_2']), '{city_upper}' => wc_strtoupper($args['city']), '{state_upper}' => wc_strtoupper($full_state), '{state_code}' => wc_strtoupper($state), '{postcode_upper}' => wc_strtoupper($args['postcode']), '{country_upper}' => wc_strtoupper($full_country)), $args)); $formatted_address = str_replace(array_keys($replace), $replace, $format); $formatted_address = preg_replace('/ +/', ' ', trim($formatted_address)); $formatted_address = preg_replace('/\\n\\n+/', "\n", $formatted_address); $formatted_address = array_filter(array_map(array($this, 'trim_formatted_address_line'), explode("\n", $formatted_address))); $formatted_address = implode($separator, $formatted_address); return $formatted_address; } private function trim_formatted_address_line($line) { return trim($line, ', '); } public function get_default_address_fields() { $address_2_label = __('Apartment, suite, unit, etc.', 'woocommerce'); if ('optional' === get_option('woocommerce_checkout_address_2_field', 'optional')) { $address_2_placeholder = __('Apartment, suite, unit, etc. (optional)', 'woocommerce'); } else { $address_2_placeholder = $address_2_label; } $fields = array('first_name' => array('label' => __('First name', 'woocommerce'), 'required' => true, 'class' => array('form-row-first'), 'autocomplete' => 'given-name', 'priority' => 10), 'last_name' => array('label' => __('Last name', 'woocommerce'), 'required' => true, 'class' => array('form-row-last'), 'autocomplete' => 'family-name', 'priority' => 20), 'company' => array('label' => __('Company name', 'woocommerce'), 'class' => array('form-row-wide'), 'autocomplete' => 'organization', 'priority' => 30, 'required' => 'required' === get_option('woocommerce_checkout_company_field', 'optional')), 'country' => array('type' => 'country', 'label' => __('Country / Region', 'woocommerce'), 'required' => true, 'class' => array('form-row-wide', 'address-field', 'update_totals_on_change'), 'autocomplete' => 'country', 'priority' => 40), 'address_1' => array('label' => __('Street address', 'woocommerce'), 'placeholder' => esc_attr__('House number and street name', 'woocommerce'), 'required' => true, 'class' => array('form-row-wide', 'address-field'), 'autocomplete' => 'address-line1', 'priority' => 50), 'address_2' => array('label' => $address_2_label, 'label_class' => array('screen-reader-text'), 'placeholder' => esc_attr($address_2_placeholder), 'class' => array('form-row-wide', 'address-field'), 'autocomplete' => 'address-line2', 'priority' => 60, 'required' => 'required' === get_option('woocommerce_checkout_address_2_field', 'optional')), 'city' => array('label' => __('Town / City', 'woocommerce'), 'required' => true, 'class' => array('form-row-wide', 'address-field'), 'autocomplete' => 'address-level2', 'priority' => 70), 'state' => array('type' => 'state', 'label' => __('State / County', 'woocommerce'), 'required' => true, 'class' => array('form-row-wide', 'address-field'), 'validate' => array('state'), 'autocomplete' => 'address-level1', 'priority' => 80), 'postcode' => array('label' => __('Postcode / ZIP', 'woocommerce'), 'required' => true, 'class' => array('form-row-wide', 'address-field'), 'validate' => array('postcode'), 'autocomplete' => 'postal-code', 'priority' => 90)); if ('hidden' === get_option('woocommerce_checkout_company_field', 'optional')) { unset($fields['company']); } if ('hidden' === get_option('woocommerce_checkout_address_2_field', 'optional')) { unset($fields['address_2']); } $default_address_fields = apply_filters('woocommerce_default_address_fields', $fields); uasort($default_address_fields, 'wc_checkout_fields_uasort_comparison'); return $default_address_fields; } public function get_country_locale_field_selectors() { $locale_fields = array('address_1' => '#billing_address_1_field, #shipping_address_1_field', 'address_2' => '#billing_address_2_field, #shipping_address_2_field', 'state' => '#billing_state_field, #shipping_state_field, #calc_shipping_state_field', 'postcode' => '#billing_postcode_field, #shipping_postcode_field, #calc_shipping_postcode_field', 'city' => '#billing_city_field, #shipping_city_field, #calc_shipping_city_field'); return apply_filters('woocommerce_country_locale_field_selectors', $locale_fields); } public function get_country_locale() { if (empty($this->locale)) { $this->locale = apply_filters('woocommerce_get_country_locale', array('AE' => array('postcode' => array('required' => false, 'hidden' => true), 'state' => array('required' => false)), 'AF' => array('state' => array('required' => false, 'hidden' => true)), 'AO' => array('postcode' => array('required' => false, 'hidden' => true), 'state' => array('label' => __('Province', 'woocommerce'))), 'AT' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'AU' => array('city' => array('label' => __('Suburb', 'woocommerce')), 'postcode' => array('label' => __('Postcode', 'woocommerce')), 'state' => array('label' => __('State', 'woocommerce'))), 'AX' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'BA' => array('postcode' => array('priority' => 65), 'state' => array('label' => __('Canton', 'woocommerce'), 'required' => false, 'hidden' => true)), 'BD' => array('postcode' => array('required' => false), 'state' => array('label' => __('District', 'woocommerce'))), 'BE' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'BH' => array('postcode' => array('required' => false), 'state' => array('required' => false, 'hidden' => true)), 'BI' => array('state' => array('required' => false, 'hidden' => true)), 'BO' => array('postcode' => array('required' => false, 'hidden' => true)), 'BS' => array('postcode' => array('required' => false, 'hidden' => true)), 'CA' => array('postcode' => array('label' => __('Postal code', 'woocommerce')), 'state' => array('label' => __('Province', 'woocommerce'))), 'CH' => array('postcode' => array('priority' => 65), 'state' => array('label' => __('Canton', 'woocommerce'), 'required' => false)), 'CL' => array('city' => array('required' => true), 'postcode' => array('required' => false), 'state' => array('label' => __('Region', 'woocommerce'))), 'CN' => array('state' => array('label' => __('Province', 'woocommerce'))), 'CO' => array('postcode' => array('required' => false)), 'CW' => array('postcode' => array('required' => false, 'hidden' => true), 'state' => array('required' => false)), 'CZ' => array('state' => array('required' => false, 'hidden' => true)), 'DE' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'DK' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'EE' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'FI' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'FR' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'GH' => array('postcode' => array('required' => false), 'state' => array('label' => __('Region', 'woocommerce'))), 'GP' => array('state' => array('required' => false, 'hidden' => true)), 'GF' => array('state' => array('required' => false, 'hidden' => true)), 'GR' => array('state' => array('required' => false)), 'GT' => array('postcode' => array('required' => false, 'hidden' => true), 'state' => array('label' => __('Department', 'woocommerce'))), 'HK' => array('postcode' => array('required' => false), 'city' => array('label' => __('Town / District', 'woocommerce')), 'state' => array('label' => __('Region', 'woocommerce'))), 'HU' => array('last_name' => array('class' => array('form-row-first'), 'priority' => 10), 'first_name' => array('class' => array('form-row-last'), 'priority' => 20), 'postcode' => array('class' => array('form-row-first', 'address-field'), 'priority' => 65), 'city' => array('class' => array('form-row-last', 'address-field')), 'address_1' => array('priority' => 71), 'address_2' => array('priority' => 72), 'state' => array('label' => __('County', 'woocommerce'))), 'ID' => array('state' => array('label' => __('Province', 'woocommerce'))), 'IE' => array('postcode' => array('required' => false, 'label' => __('Eircode', 'woocommerce')), 'state' => array('label' => __('County', 'woocommerce'))), 'IS' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'IL' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'IM' => array('state' => array('required' => false, 'hidden' => true)), 'IN' => array('postcode' => array('label' => __('PIN', 'woocommerce')), 'state' => array('label' => __('State', 'woocommerce'))), 'IT' => array('postcode' => array('priority' => 65), 'state' => array('required' => true, 'label' => __('Province', 'woocommerce'))), 'JM' => array('city' => array('label' => __('Town / City / Post Office', 'woocommerce')), 'postcode' => array('required' => false, 'label' => __('Postal Code', 'woocommerce')), 'state' => array('required' => true, 'label' => __('Parish', 'woocommerce'))), 'JP' => array('last_name' => array('class' => array('form-row-first'), 'priority' => 10), 'first_name' => array('class' => array('form-row-last'), 'priority' => 20), 'postcode' => array('class' => array('form-row-first', 'address-field'), 'priority' => 65), 'state' => array('label' => __('Prefecture', 'woocommerce'), 'class' => array('form-row-last', 'address-field'), 'priority' => 66), 'city' => array('priority' => 67), 'address_1' => array('priority' => 68), 'address_2' => array('priority' => 69)), 'KR' => array('state' => array('required' => false, 'hidden' => true)), 'KW' => array('state' => array('required' => false, 'hidden' => true)), 'LV' => array('state' => array('label' => __('Municipality', 'woocommerce'), 'required' => false)), 'LB' => array('state' => array('required' => false, 'hidden' => true)), 'MQ' => array('state' => array('required' => false, 'hidden' => true)), 'MT' => array('state' => array('required' => false, 'hidden' => true)), 'MZ' => array('postcode' => array('required' => false, 'hidden' => true), 'state' => array('label' => __('Province', 'woocommerce'))), 'NL' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'NG' => array('postcode' => array('label' => __('Postcode', 'woocommerce'), 'required' => false, 'hidden' => true), 'state' => array('label' => __('State', 'woocommerce'))), 'NZ' => array('postcode' => array('label' => __('Postcode', 'woocommerce')), 'state' => array('required' => false, 'label' => __('Region', 'woocommerce'))), 'NO' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'NP' => array('state' => array('label' => __('State / Zone', 'woocommerce')), 'postcode' => array('required' => false)), 'PL' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'PR' => array('city' => array('label' => __('Municipality', 'woocommerce')), 'state' => array('required' => false, 'hidden' => true)), 'PT' => array('state' => array('required' => false, 'hidden' => true)), 'RE' => array('state' => array('required' => false, 'hidden' => true)), 'RO' => array('state' => array('label' => __('County', 'woocommerce'), 'required' => true)), 'RS' => array('city' => array('required' => true), 'postcode' => array('required' => true), 'state' => array('label' => __('District', 'woocommerce'), 'required' => false)), 'SG' => array('state' => array('required' => false, 'hidden' => true), 'city' => array('required' => false)), 'SK' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'SI' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'SR' => array('postcode' => array('required' => false, 'hidden' => true)), 'ES' => array('postcode' => array('priority' => 65), 'state' => array('label' => __('Province', 'woocommerce'))), 'LI' => array('postcode' => array('priority' => 65), 'state' => array('label' => __('Municipality', 'woocommerce'), 'required' => false)), 'LK' => array('state' => array('required' => false, 'hidden' => true)), 'LU' => array('state' => array('required' => false, 'hidden' => true)), 'MD' => array('state' => array('label' => __('Municipality / District', 'woocommerce'))), 'SE' => array('postcode' => array('priority' => 65), 'state' => array('required' => false, 'hidden' => true)), 'TR' => array('postcode' => array('priority' => 65), 'state' => array('label' => __('Province', 'woocommerce'))), 'UG' => array('postcode' => array('required' => false, 'hidden' => true), 'city' => array('label' => __('Town / Village', 'woocommerce'), 'required' => true), 'state' => array('label' => __('District', 'woocommerce'), 'required' => true)), 'US' => array('postcode' => array('label' => __('ZIP Code', 'woocommerce')), 'state' => array('label' => __('State', 'woocommerce'))), 'GB' => array('postcode' => array('label' => __('Postcode', 'woocommerce')), 'state' => array('label' => __('County', 'woocommerce'), 'required' => false)), 'ST' => array('postcode' => array('required' => false, 'hidden' => true), 'state' => array('label' => __('District', 'woocommerce'))), 'VN' => array('state' => array('required' => false, 'hidden' => true), 'postcode' => array('priority' => 65, 'required' => false, 'hidden' => false), 'address_2' => array('required' => false, 'hidden' => true)), 'WS' => array('postcode' => array('required' => false, 'hidden' => true)), 'YT' => array('state' => array('required' => false, 'hidden' => true)), 'ZA' => array('state' => array('label' => __('Province', 'woocommerce'))), 'ZW' => array('postcode' => array('required' => false, 'hidden' => true)))); $this->locale = array_intersect_key($this->locale, array_merge($this->get_allowed_countries(), $this->get_shipping_countries())); $this->locale['default'] = apply_filters('woocommerce_get_country_locale_default', $this->get_default_address_fields()); if (!isset($this->locale[$this->get_base_country()])) { $this->locale[$this->get_base_country()] = $this->locale['default']; } $this->locale['default'] = apply_filters('woocommerce_get_country_locale_base', $this->locale['default']); $this->locale[$this->get_base_country()] = apply_filters('woocommerce_get_country_locale_base', $this->locale[$this->get_base_country()]); } return $this->locale; } public function get_address_fields($country = '', $type = 'billing_') { if (!$country) { $country = $this->get_base_country(); } $fields = $this->get_default_address_fields(); $locale = $this->get_country_locale(); if (isset($locale[$country])) { $fields = wc_array_overlay($fields, $locale[$country]); } $address_fields = array(); foreach ($fields as $key => $value) { if ('state' === $key) { $value['country_field'] = $type . 'country'; $value['country'] = $country; } $address_fields[$type . $key] = $value; } if ('billing_' === $type) { if ('hidden' !== get_option('woocommerce_checkout_phone_field', 'required')) { $address_fields['billing_phone'] = array('label' => __('Phone', 'woocommerce'), 'required' => 'required' === get_option('woocommerce_checkout_phone_field', 'required'), 'type' => 'tel', 'class' => array('form-row-wide'), 'validate' => array('phone'), 'autocomplete' => 'tel', 'priority' => 100); } $address_fields['billing_email'] = array('label' => __('Email address', 'woocommerce'), 'required' => true, 'type' => 'email', 'class' => array('form-row-wide'), 'validate' => array('email'), 'autocomplete' => 'no' === get_option('woocommerce_registration_generate_username') ? 'email' : 'email username', 'priority' => 110); } $address_fields = apply_filters('woocommerce_' . $type . 'fields', $address_fields, $country); uasort($address_fields, 'wc_checkout_fields_uasort_comparison'); return $address_fields; } }