/**
  * Get shipping zones from the database
  * @since 2.6.0
  * @return array of arrays
  */
 public static function get_zones()
 {
     global $wpdb;
     $raw_zones = $wpdb->get_results("SELECT zone_id, zone_name, zone_order FROM {$wpdb->prefix}woocommerce_shipping_zones order by zone_order ASC;");
     $zones = array();
     foreach ($raw_zones as $raw_zone) {
         $zone = new WC_Shipping_Zone($raw_zone);
         $zones[$zone->get_zone_id()] = $zone->get_data();
         $zones[$zone->get_zone_id()]['formatted_zone_location'] = $zone->get_formatted_location();
         $zones[$zone->get_zone_id()]['shipping_methods'] = $zone->get_shipping_methods();
     }
     return $zones;
 }
 /**
  * Get the shipping methods for all shipping zones.
  *
  * Note: WooCommerce 2.6 intoduces the concept of Shipping Zones
  *
  * @return array (Array of) all shipping methods instances
  */
 public function getZonesShippingMethods()
 {
     $zones = array();
     // Rest of the World zone
     $zone = new \WC_Shipping_Zone();
     $zones[$zone->get_zone_id()] = $zone->get_data();
     $zones[$zone->get_zone_id()]['formatted_zone_location'] = $zone->get_formatted_location();
     $zones[$zone->get_zone_id()]['shipping_methods'] = $zone->get_shipping_methods();
     // Add user configured zones
     $zones = array_merge($zones, \WC_Shipping_Zones::get_zones());
     $shipping_methods = array();
     // Format:  $shipping_methods[zone_name_method_id] => shipping_method_object
     // where zone_name is e.g. domestic, europe, rest_of_the_world, and
     // methods_id is e.g. flat_rate, free_shiping, local_pickup, etc
     foreach ($zones as $zone) {
         foreach ($zone['shipping_methods'] as $instance_id => $shipping_method) {
             // Zone names are converted to all lower-case and spaces replaced with
             $shipping_methods[$shipping_method->id . '_' . $instance_id] = $shipping_method;
         }
     }
     return $shipping_methods;
 }
 /**
  * Handle submissions from assets/js/wc-shipping-zone-methods.js Backbone model.
  */
 public static function shipping_zone_methods_save_changes()
 {
     if (!isset($_POST['wc_shipping_zones_nonce'], $_POST['zone_id'], $_POST['changes'])) {
         wp_send_json_error('missing_fields');
         exit;
     }
     if (!wp_verify_nonce($_POST['wc_shipping_zones_nonce'], 'wc_shipping_zones_nonce')) {
         wp_send_json_error('bad_nonce');
         exit;
     }
     if (!current_user_can('manage_woocommerce')) {
         wp_send_json_error('missing_capabilities');
         exit;
     }
     global $wpdb;
     $zone_id = wc_clean($_POST['zone_id']);
     $zone = new WC_Shipping_Zone($zone_id);
     $changes = $_POST['changes'];
     if (isset($changes['zone_name'])) {
         $zone->set_zone_name(wc_clean($changes['zone_name']));
     }
     if (isset($changes['zone_locations'])) {
         $zone->clear_locations(array('state', 'country', 'continent'));
         $locations = array_filter(array_map('wc_clean', (array) $changes['zone_locations']));
         foreach ($locations as $location) {
             // Each posted location will be in the format type:code
             $location_parts = explode(':', $location);
             switch ($location_parts[0]) {
                 case 'state':
                     $zone->add_location($location_parts[1] . ':' . $location_parts[2], 'state');
                     break;
                 case 'country':
                     $zone->add_location($location_parts[1], 'country');
                     break;
                 case 'continent':
                     $zone->add_location($location_parts[1], 'continent');
                     break;
             }
         }
     }
     if (isset($changes['zone_postcodes'])) {
         $zone->clear_locations('postcode');
         $postcodes = array_filter(array_map('strtoupper', array_map('wc_clean', explode("\n", $changes['zone_postcodes']))));
         foreach ($postcodes as $postcode) {
             $zone->add_location($postcode, 'postcode');
         }
     }
     if (isset($changes['methods'])) {
         foreach ($changes['methods'] as $instance_id => $data) {
             $method_id = $wpdb->get_var($wpdb->prepare("SELECT method_id FROM {$wpdb->prefix}woocommerce_shipping_zone_methods WHERE instance_id = %d", $instance_id));
             if (isset($data['deleted'])) {
                 $shipping_method = WC_Shipping_Zones::get_shipping_method($instance_id);
                 $option_key = $shipping_method->get_instance_option_key();
                 if ($wpdb->delete("{$wpdb->prefix}woocommerce_shipping_zone_methods", array('instance_id' => $instance_id))) {
                     delete_option($option_key);
                     do_action('woocommerce_shipping_zone_method_deleted', $instance_id, $method_id, $zone_id);
                 }
                 continue;
             }
             $method_data = array_intersect_key($data, array('method_order' => 1, 'enabled' => 1));
             if (isset($method_data['method_order'])) {
                 $wpdb->update("{$wpdb->prefix}woocommerce_shipping_zone_methods", array('method_order' => absint($method_data['method_order'])), array('instance_id' => absint($instance_id)));
             }
             if (isset($method_data['enabled'])) {
                 $is_enabled = absint('yes' === $method_data['enabled']);
                 if ($wpdb->update("{$wpdb->prefix}woocommerce_shipping_zone_methods", array('is_enabled' => $is_enabled), array('instance_id' => absint($instance_id)))) {
                     do_action('woocommerce_shipping_zone_method_status_toggled', $instance_id, $method_id, $zone_id, $is_enabled);
                 }
             }
         }
     }
     $zone->save();
     wp_send_json_success(array('zone_id' => $zone->get_zone_id(), 'zone_name' => $zone->get_zone_name(), 'methods' => $zone->get_shipping_methods()));
 }