<?php defined('ABSPATH') || exit; require_once __DIR__ . '/legacy/class-wc-legacy-shipping-zone.php'; class WC_Shipping_Zone extends WC_Legacy_Shipping_Zone { protected $id = null; protected $object_type = 'shipping_zone'; protected $data = array('zone_name' => '', 'zone_order' => 0, 'zone_locations' => array()); public function __construct($zone = null) { if (is_numeric($zone) && !empty($zone)) { $this->set_id($zone); } elseif (is_object($zone)) { $this->set_id($zone->zone_id); } elseif (0 === $zone || '0' === $zone) { $this->set_id(0); } else { $this->set_object_read(true); } $this->data_store = WC_Data_Store::load('shipping-zone'); if (false === $this->get_object_read()) { $this->data_store->read($this); } } public function get_zone_name($context = 'view') { return $this->get_prop('zone_name', $context); } public function get_zone_order($context = 'view') { return $this->get_prop('zone_order', $context); } public function get_zone_locations($context = 'view') { return $this->get_prop('zone_locations', $context); } public function get_formatted_location($max = 10, $context = 'view') { $location_parts = array(); $all_continents = WC()->countries->get_continents(); $all_countries = WC()->countries->get_countries(); $all_states = WC()->countries->get_states(); $locations = $this->get_zone_locations($context); $continents = array_filter($locations, array($this, 'location_is_continent')); $countries = array_filter($locations, array($this, 'location_is_country')); $states = array_filter($locations, array($this, 'location_is_state')); $postcodes = array_filter($locations, array($this, 'location_is_postcode')); foreach ($continents as $location) { $location_parts[] = $all_continents[$location->code]['name']; } foreach ($countries as $location) { $location_parts[] = $all_countries[$location->code]; } foreach ($states as $location) { $location_codes = explode(':', $location->code); $location_parts[] = $all_states[$location_codes[0]][$location_codes[1]]; } foreach ($postcodes as $location) { $location_parts[] = $location->code; } $location_parts = array_map('html_entity_decode', $location_parts); if (count($location_parts) > $max) { $remaining = count($location_parts) - $max; return sprintf(_n('%s and %d other region', '%s and %d other regions', $remaining, 'woocommerce'), implode(', ', array_splice($location_parts, 0, $max)), $remaining); } elseif (!empty($location_parts)) { return implode(', ', $location_parts); } else { return __('Everywhere', 'woocommerce'); } } public function get_shipping_methods($enabled_only = false, $context = 'admin') { if (null === $this->get_id()) { return array(); } $raw_methods = $this->data_store->get_methods($this->get_id(), $enabled_only); $wc_shipping = WC_Shipping::instance(); $allowed_classes = $wc_shipping->get_shipping_method_class_names(); $methods = array(); foreach ($raw_methods as $raw_method) { if (in_array($raw_method->method_id, array_keys($allowed_classes), true)) { $class_name = $allowed_classes[$raw_method->method_id]; $instance_id = $raw_method->instance_id; if (is_object($class_name)) { $class_name_of_instance = get_class($class_name); $methods[$instance_id] = new $class_name_of_instance($instance_id); } else { if (is_string($class_name) && class_exists($class_name)) { $methods[$instance_id] = new $class_name($instance_id); } } if (is_object($methods[$instance_id])) { $methods[$instance_id]->method_order = absint($raw_method->method_order); $methods[$instance_id]->enabled = $raw_method->is_enabled ? 'yes' : 'no'; $methods[$instance_id]->has_settings = $methods[$instance_id]->has_settings(); $methods[$instance_id]->settings_html = $methods[$instance_id]->supports('instance-settings-modal') ? $methods[$instance_id]->get_admin_options_html() : false; $methods[$instance_id]->method_description = wp_kses_post(wpautop($methods[$instance_id]->method_description)); } if ('json' === $context) { $methods[$instance_id] = (object) get_object_vars($methods[$instance_id]); unset($methods[$instance_id]->instance_form_fields, $methods[$instance_id]->form_fields); } } } uasort($methods, 'wc_shipping_zone_method_order_uasort_comparison'); return apply_filters('woocommerce_shipping_zone_shipping_methods', $methods, $raw_methods, $allowed_classes, $this); } public function set_zone_name($set) { $this->set_prop('zone_name', wc_clean($set)); } public function set_zone_order($set) { $this->set_prop('zone_order', absint($set)); } public function set_zone_locations($locations) { if (0 !== $this->get_id()) { $this->set_prop('zone_locations', $locations); } } public function save() { if (!$this->get_zone_name()) { $this->set_zone_name($this->generate_zone_name()); } if (!$this->data_store) { return $this->get_id(); } do_action('woocommerce_before_' . $this->object_type . '_object_save', $this, $this->data_store); if (null !== $this->get_id()) { $this->data_store->update($this); } else { $this->data_store->create($this); } do_action('woocommerce_after_' . $this->object_type . '_object_save', $this, $this->data_store); return $this->get_id(); } protected function generate_zone_name() { $zone_name = $this->get_formatted_location(); if (empty($zone_name)) { $zone_name = __('Zone', 'woocommerce'); } return $zone_name; } private function location_is_continent($location) { return 'continent' === $location->type; } private function location_is_country($location) { return 'country' === $location->type; } private function location_is_state($location) { return 'state' === $location->type; } private function location_is_postcode($location) { return 'postcode' === $location->type; } public function is_valid_location_type($type) { return in_array($type, apply_filters('woocommerce_valid_location_types', array('postcode', 'state', 'country', 'continent')), true); } public function add_location($code, $type) { if (0 !== $this->get_id() && $this->is_valid_location_type($type)) { if ('postcode' === $type) { $code = trim(strtoupper(str_replace(chr(226) . chr(128) . chr(166), '...', $code))); } $location = array('code' => wc_clean($code), 'type' => wc_clean($type)); $zone_locations = $this->get_prop('zone_locations', 'edit'); $zone_locations[] = (object) $location; $this->set_prop('zone_locations', $zone_locations); } } public function clear_locations($types = array('postcode', 'state', 'country', 'continent')) { if (!is_array($types)) { $types = array($types); } $zone_locations = $this->get_prop('zone_locations', 'edit'); foreach ($zone_locations as $key => $values) { if (in_array($values->type, $types, true)) { unset($zone_locations[$key]); } } $zone_locations = array_values($zone_locations); $this->set_prop('zone_locations', $zone_locations); } public function set_locations($locations = array()) { $this->clear_locations(); foreach ($locations as $location) { $this->add_location($location['code'], $location['type']); } } public function add_shipping_method($type) { if (null === $this->get_id()) { $this->save(); } $instance_id = 0; $wc_shipping = WC_Shipping::instance(); $allowed_classes = $wc_shipping->get_shipping_method_class_names(); $count = $this->data_store->get_method_count($this->get_id()); if (in_array($type, array_keys($allowed_classes), true)) { $instance_id = $this->data_store->add_method($this->get_id(), $type, $count + 1); } if ($instance_id) { do_action('woocommerce_shipping_zone_method_added', $instance_id, $type, $this->get_id()); } WC_Cache_Helper::get_transient_version('shipping', true); return $instance_id; } public function delete_shipping_method($instance_id) { if (null === $this->get_id()) { return false; } $method = $this->data_store->get_method($instance_id); if ($method) { $this->data_store->delete_method($instance_id); do_action('woocommerce_shipping_zone_method_deleted', $instance_id, $method->method_id, $this->get_id()); } WC_Cache_Helper::get_transient_version('shipping', true); return true; } }