Commit 36b99fe4036 for woocommerce
commit 36b99fe4036758192146222b66f83f157c60c25a
Author: Jorge A. Torres <jorge.torres@automattic.com>
Date: Thu Aug 27 20:06:46 2026 +0100
Only treat address fields as hidden when the flag is exactly true (#68111)
diff --git a/plugins/woocommerce/includes/class-wc-checkout.php b/plugins/woocommerce/includes/class-wc-checkout.php
index b24e632e3a9..d7b60a72047 100644
--- a/plugins/woocommerce/includes/class-wc-checkout.php
+++ b/plugins/woocommerce/includes/class-wc-checkout.php
@@ -909,7 +909,7 @@ class WC_Checkout {
if ( ! isset( $data[ $key ] ) ) {
continue;
}
- $required = ! empty( $field['required'] ) && empty( $field['hidden'] );
+ $required = ! empty( $field['required'] ) && true !== ( $field['hidden'] ?? false );
$format = array_filter( isset( $field['validate'] ) ? (array) $field['validate'] : array() );
$field_label = isset( $field['label'] ) ? $field['label'] : '';
diff --git a/plugins/woocommerce/includes/class-wc-form-handler.php b/plugins/woocommerce/includes/class-wc-form-handler.php
index d945c5a5b57..f47c54ce4e5 100644
--- a/plugins/woocommerce/includes/class-wc-form-handler.php
+++ b/plugins/woocommerce/includes/class-wc-form-handler.php
@@ -195,7 +195,7 @@ class WC_Form_Handler {
$value = apply_filters( 'woocommerce_process_myaccount_field_' . $key, $value );
// Validation: Required fields.
- if ( ! empty( $field['required'] ) && empty( $field['hidden'] ) && empty( $value ) ) {
+ if ( ! empty( $field['required'] ) && true !== ( $field['hidden'] ?? false ) && empty( $value ) ) {
/* translators: %s: Field name. */
wc_add_notice( sprintf( __( '%s is a required field.', 'woocommerce' ), $field['label'] ), 'error', array( 'id' => $key ) );
}
diff --git a/plugins/woocommerce/tests/php/includes/class-wc-checkout-test.php b/plugins/woocommerce/tests/php/includes/class-wc-checkout-test.php
index 07db9678c6e..f6f9f4f01fe 100644
--- a/plugins/woocommerce/tests/php/includes/class-wc-checkout-test.php
+++ b/plugins/woocommerce/tests/php/includes/class-wc-checkout-test.php
@@ -217,14 +217,17 @@ class WC_Checkout_Test extends \WC_Unit_Test_Case {
}
/**
- * @testdox 'validate_posted_data' skips the required check for fields hidden via the country locale.
+ * @testdox 'validate_posted_data' skips the required check only for fields whose locale hidden flag is exactly true.
*
- * @testWith [true]
- * [false]
+ * @testWith [true, false]
+ * [false, true]
+ * ["yes", true]
+ * [1, true]
*
- * @param bool $hidden Whether the locale marks the postcode field as hidden.
+ * @param mixed $hidden Value of the locale's hidden flag for the postcode field.
+ * @param bool $expect_required_error Whether a required-field error is expected.
*/
- public function test_validate_posted_data_skips_required_check_for_hidden_fields( $hidden ) {
+ public function test_validate_posted_data_skips_required_check_for_hidden_fields( $hidden, $expect_required_error ) {
$locale_filter = function ( $locale ) use ( $hidden ) {
$locale['ES']['postcode']['hidden'] = $hidden;
return $locale;
@@ -243,10 +246,10 @@ class WC_Checkout_Test extends \WC_Unit_Test_Case {
$this->sut->validate_posted_data( $data, $errors );
$required_error = $errors->get_error_message( 'billing_postcode_required' );
- if ( $hidden ) {
- $this->assertEmpty( $required_error, 'Hidden fields should not trigger a required-field error.' );
+ if ( $expect_required_error ) {
+ $this->assertNotEmpty( $required_error, 'Fields not hidden with exactly true should still trigger a required-field error.' );
} else {
- $this->assertNotEmpty( $required_error, 'Visible required fields should still trigger a required-field error.' );
+ $this->assertEmpty( $required_error, 'Hidden fields should not trigger a required-field error.' );
}
}