Merge pull request #27628 from woocommerce/fix/27624

Check for state and postcode fields only if required
This commit is contained in:
jonathansadowski 2020-09-09 09:41:57 -05:00 committed by GitHub
commit d00083f1ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 1 deletions

View File

@ -1528,7 +1528,15 @@ class WC_Cart extends WC_Legacy_Cart {
}
if ( 'yes' === get_option( 'woocommerce_shipping_cost_requires_address' ) ) {
if ( ! $this->get_customer()->get_shipping_country() || ! $this->get_customer()->get_shipping_state() || ! $this->get_customer()->get_shipping_postcode() ) {
$country = $this->get_customer()->get_shipping_country();
if ( ! $country ) {
return false;
}
$country_fields = WC()->countries->get_address_fields( $country, 'shipping_' );
if ( isset( $country_fields['shipping_state'] ) && $country_fields['shipping_state']['required'] && ! $this->get_customer()->get_shipping_state() ) {
return false;
}
if ( isset( $country_fields['shipping_postcode'] ) && $country_fields['shipping_postcode']['required'] && ! $this->get_customer()->get_shipping_postcode() ) {
return false;
}
}

View File

@ -99,4 +99,37 @@ class WC_Cart_Test extends \WC_Unit_Test_Case {
WC()->cart->get_customer()->set_shipping_state( '' );
WC()->cart->get_customer()->set_shipping_postcode( '' );
}
/**
* Test show_shipping for countries with various state/postcode requirement.
*/
public function test_show_shipping_for_countries_different_shipping_requirements() {
$default_shipping_cost_requires_address = get_option( 'woocommerce_shipping_cost_requires_address', 'no' );
update_option( 'woocommerce_shipping_cost_requires_address', 'yes' );
WC()->cart->empty_cart();
$this->assertFalse( WC()->cart->show_shipping() );
$product = WC_Helper_Product::create_simple_product();
WC()->cart->add_to_cart( $product->get_id(), 1 );
// Country that does not require state.
WC()->cart->get_customer()->set_shipping_country( 'LB' );
WC()->cart->get_customer()->set_shipping_state( '' );
WC()->cart->get_customer()->set_shipping_postcode( '12345' );
$this->assertTrue( WC()->cart->show_shipping() );
// Country that does not require postcode.
WC()->cart->get_customer()->set_shipping_country( 'NG' );
WC()->cart->get_customer()->set_shipping_state( 'AB' );
WC()->cart->get_customer()->set_shipping_postcode( '' );
$this->assertTrue( WC()->cart->show_shipping() );
// Reset.
update_option( 'woocommerce_shipping_cost_requires_address', $default_shipping_cost_requires_address );
$product->delete( true );
WC()->cart->get_customer()->set_shipping_country( 'GB' );
WC()->cart->get_customer()->set_shipping_state( '' );
WC()->cart->get_customer()->set_shipping_postcode( '' );
}
}