<?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) . ' — ' . ($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;
}
}