Hola,
WooCommerce tiene ese comportamiento predeterminado y es comprensible que dicha característica pueda formar una parte del núcleo. Le recomiendo que publique esto como un requisito de característica aquí: https://woocommerce.com/feature-requests/wooCommerce/
Mientras tanto, puede continuar con la solución que ya tiene o puede probar esta solución más limpia para evitar el uso de ‘ -‘ o ‘000001’
WooCommerce decide lo que se requiere por país a través de su mapa local de país. Puede anular eso y también relajar la validación para que el estado y el código postal no sean necesarios (y se pueden ocultar) para los países que no los usan (por ejemplo, Tonga To). Hágalo como un pequeño complemento de uso obligatorio para que se cargue de manera confiable y no se pierda en las actualizaciones del tema.
Cree WP-Content/MU-Plugins/Woo-Pacific-Address-Relax.php este código. Recuerde no agregar nada a las funciones.php o los archivos de comercio Core Woo, ya que podrían ser anulados tan pronto como los actualice.
/**
* Plugin Name: WooCommerce Pacific Address Relaxer
* Description: Makes state/postcode optional or hidden for selected countries (e.g., Tonga) in checkout, My Account, and admin.
* Author: You
* Version: 1.0.0
*/if ( ! defined('ABSPATH') ) exit;
add_action('plugins_loaded', function () {
// Countries that don't require state/postcode (add/remove as needed)
$GLOBALS['mr_wc_relaxed_countries'] = apply_filters('mr_wc_relaxed_country_codes', [
'TO', // Tonga
// Add others if needed:
// 'TV', // Tuvalu
// 'WS', // Samoa
// 'KI', // Kiribati
// 'NU', // Niue
// 'CK', // Cook Islands
// 'VU', // Vanuatu
// 'NR', // Nauru
// 'PF', // French Polynesia (check your use case)
// 'NC', // New Caledonia
// 'FJ', // Fiji (if you want to relax it)
]);
/**
* 1) Adjust WooCommerce country locale so state/postcode are not required
* (this drives the live checkout UI when country is changed).
*/
add_filter('woocommerce_get_country_locale', function ($locale) {
$targets = $GLOBALS['mr_wc_relaxed_countries'] ?? [];
foreach ($targets as $code) {
// Ensure an array exists for the country
if ( ! isset($locale[$code]) ) $locale[$code] = [];
// Mark state/postcode as not required; also push them low so they’re unobtrusive
foreach (['state','postcode'] as $field) {
if ( ! isset($locale[$code][$field]) ) $locale[$code][$field] = [];
$locale[$code][$field]['required'] = false;
$locale[$code][$field]['priority'] = 999;
}
}
return $locale;
});
/**
* 2) Belt-and-suspenders: when checkout fields are built, ensure the
* selected billing/shipping country doesn’t force validation.
*/
add_filter('woocommerce_checkout_fields', function ($fields) {
$targets = $GLOBALS['mr_wc_relaxed_countries'] ?? [];
// Current chosen countries (covers both logged-in and guests)
$billing_country = WC()->customer ? WC()->customer->get_billing_country() : null;
$shipping_country = WC()->customer ? WC()->customer->get_shipping_country() : null;
foreach (['billing' => $billing_country, 'shipping' => $shipping_country] as $section => $country) {
if ($country && in_array($country, $targets, true)) {
foreach (['state','postcode'] as $key) {
$field_key = "{$section}_{$key}";
if ( isset($fields[$section][$field_key]) ) {
$fields[$section][$field_key]['required'] = false;
// Remove any strict validators
unset($fields[$section][$field_key]['validate']);
}
}
}
}
return $fields;
}, 20);
/**
* 3) Postcode validation bypass for these countries:
* If empty, allow it; if present, you may still want to accept anything.
*/
add_filter('woocommerce_validate_postcode', function ($valid, $postcode, $country) {
$targets = $GLOBALS['mr_wc_relaxed_countries'] ?? [];
if (in_array($country, $targets, true)) {
// Empty is fine, and we won't pattern-enforce even if provided
return true;
}
return $valid;
}, 10, 3);
/**
* 4) My Account > Addresses edit screen: don’t require state/postcode.
*/
add_filter('woocommerce_address_to_edit', function ($fields, $load_address) {
$targets = $GLOBALS['mr_wc_relaxed_countries'] ?? [];
$country_key = $load_address . '_country';
$country = isset($fields[$country_key]['value']) ? $fields[$country_key]['value'] : '';
if ($country && in_array($country, $targets, true)) {
foreach (['state', 'postcode'] as $key) {
$f = $load_address . '_' . $key;
if (isset($fields[$f])) {
$fields[$f]['required'] = false;
}
}
}
return $fields;
}, 10, 2);
/**
* 5) Admin user profile edit (optional): relax required flags so staff can save.
*/
add_filter('woocommerce_customer_meta_fields', function ($fields) {
$targets = $GLOBALS['mr_wc_relaxed_countries'] ?? [];
foreach (['billing','shipping'] as $section) {
if (isset($fields[$section]['fields'])) {
$country = isset($fields[$section]['fields']["{$section}_country"]['value'])
? $fields[$section]['fields']["{$section}_country"]['value']
: '';
if ($country && in_array($country, $targets, true)) {
foreach (['state','postcode'] as $key) {
$k = "{$section}_{$key}";
if (isset($fields[$section]['fields'][$k])) {
$fields[$section]['fields'][$k]['required'] = false;
}
}
}
}
}
return $fields;
});
/**
* 6) Presentation: Woo will already skip empty fields in formatted addresses.
* Nothing special needed here, but this ensures no fake "-" or "0001" ever prints.
*/
});
Verá esto como un complemento imprescindible en su panel de administración de WordPress, activelo si no está activado. Luego puede probar, los campos ya no deberían ser requeridos.
Agregue cualquier otro país a los $ Globals[‘mr_wc_relaxed_countries’] Matriz si desea incluir más países a esta regla.
En cualquier caso, asegúrese de plantear una solicitud de función en Woo Commerce, de esta manera llegará a las personas adecuadas que puedan considerar esto.