public static get_zone_matching_package ( object $package ) : WC_Shipping_Zone | ||
$package | object | |
return | WC_Shipping_Zone |
public static function get_zone_matching_package($package)
{
$country = strtoupper(wc_clean($package['destination']['country']));
$state = strtoupper(wc_clean($package['destination']['state']));
$continent = strtoupper(wc_clean(WC()->countries->get_continent_code_for_country($country)));
$postcode = wc_normalize_postcode(wc_clean($package['destination']['postcode']));
$cache_key = WC_Cache_Helper::get_cache_prefix('shipping_zones') . 'wc_shipping_zone_' . md5(sprintf('%s+%s+%s', $country, $state, $postcode));
$matching_zone_id = wp_cache_get($cache_key, 'shipping_zones');
if (false === $matching_zone_id) {
$data_store = WC_Data_Store::load('shipping-zone');
$matching_zone_id = $data_store->get_zone_id_from_package($package);
wp_cache_set($cache_key, $matching_zone_id, 'shipping_zones');
}
return new WC_Shipping_Zone($matching_zone_id ? $matching_zone_id : 0);
}
/** * Test: WC_Shipping_Zones::get_zone_matching_package */ public function test_get_zone_matching_package() { // Setup WC_Helper_Shipping_Zones::create_mock_zones(); // Test $zone1 = WC_Shipping_Zones::get_zone_matching_package(array('destination' => array('country' => 'GB', 'state' => 'Cambs', 'postcode' => 'CB23 1GG'))); $zone2 = WC_Shipping_Zones::get_zone_matching_package(array('destination' => array('country' => 'GB', 'state' => 'Cambs', 'postcode' => 'PE12 1BG'))); $zone3 = WC_Shipping_Zones::get_zone_matching_package(array('destination' => array('country' => 'US', 'state' => 'CA', 'postcode' => '90210'))); $zone4 = WC_Shipping_Zones::get_zone_matching_package(array('destination' => array('country' => 'US', 'state' => 'AL', 'postcode' => '12345'))); // Assert $this->assertEquals('Local', $zone1->get_zone_name()); $this->assertEquals('Europe', $zone2->get_zone_name()); $this->assertEquals('California', $zone3->get_zone_name()); $this->assertEquals('US', $zone4->get_zone_name()); // Clean WC_Helper_Shipping_Zones::remove_mock_zones(); }