Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
woocommerce
/
includes
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php use Automattic\Jetpack\Constants; if (!defined('ABSPATH')) { exit; } class WC_Shipping { public $enabled = false; public $shipping_methods = null; public $shipping_classes = array(); public $packages = array(); protected static $_instance = null; public static function instance() { if (is_null(self::$_instance)) { self::$_instance = new self(); } return self::$_instance; } public function __clone() { wc_doing_it_wrong(__FUNCTION__, __('Cloning is forbidden.', 'woocommerce'), '2.1'); } public function __wakeup() { wc_doing_it_wrong(__FUNCTION__, __('Unserializing instances of this class is forbidden.', 'woocommerce'), '2.1'); } public function __get($name) { if ('shipping_total' === $name) { return WC()->cart->get_shipping_total(); } if ('shipping_taxes' === $name) { return WC()->cart->get_shipping_taxes(); } } public function __construct() { $this->enabled = wc_shipping_enabled(); if ($this->enabled) { $this->init(); } } public function init() { do_action('woocommerce_shipping_init'); } public function get_shipping_method_class_names() { $shipping_methods = array('flat_rate' => 'WC_Shipping_Flat_Rate', 'free_shipping' => 'WC_Shipping_Free_Shipping', 'local_pickup' => 'WC_Shipping_Local_Pickup'); $maybe_load_legacy_methods = array('flat_rate', 'free_shipping', 'international_delivery', 'local_delivery', 'local_pickup'); foreach ($maybe_load_legacy_methods as $method) { $options = get_option('woocommerce_' . $method . '_settings'); if ($options && isset($options['enabled']) && 'yes' === $options['enabled']) { $shipping_methods['legacy_' . $method] = 'WC_Shipping_Legacy_' . $method; } } return apply_filters('woocommerce_shipping_methods', $shipping_methods); } public function load_shipping_methods($package = array()) { if (!empty($package)) { $debug_mode = 'yes' === get_option('woocommerce_shipping_debug_mode', 'no'); $shipping_zone = WC_Shipping_Zones::get_zone_matching_package($package); $this->shipping_methods = $shipping_zone->get_shipping_methods(true); $matched_zone_notice = sprintf(__('Customer matched zone "%s"', 'woocommerce'), $shipping_zone->get_zone_name()); if ($debug_mode && !Constants::is_defined('WOOCOMMERCE_CHECKOUT') && !Constants::is_defined('WC_DOING_AJAX') && !wc_has_notice($matched_zone_notice)) { wc_add_notice($matched_zone_notice); } } else { $this->shipping_methods = array(); } foreach ($this->get_shipping_method_class_names() as $method_id => $method_class) { $this->register_shipping_method($method_class); } do_action('woocommerce_load_shipping_methods', $package); return $this->get_shipping_methods(); } public function register_shipping_method($method) { if (!is_object($method)) { if (!class_exists($method)) { return false; } $method = new $method(); } if (is_null($this->shipping_methods)) { $this->shipping_methods = array(); } $this->shipping_methods[$method->id] = $method; } public function unregister_shipping_methods() { $this->shipping_methods = null; } public function get_shipping_methods() { if (is_null($this->shipping_methods)) { $this->load_shipping_methods(); } return $this->shipping_methods; } public function get_shipping_classes() { if (empty($this->shipping_classes)) { $classes = get_terms('product_shipping_class', array('hide_empty' => '0', 'orderby' => 'name')); $this->shipping_classes = !is_wp_error($classes) ? $classes : array(); } return apply_filters('woocommerce_get_shipping_classes', $this->shipping_classes); } public function calculate_shipping($packages = array()) { $this->packages = array(); if (!$this->enabled || empty($packages)) { return array(); } foreach ($packages as $package_key => $package) { $this->packages[$package_key] = $this->calculate_shipping_for_package($package, $package_key); } $this->packages = array_filter((array) apply_filters('woocommerce_shipping_packages', $this->packages)); return $this->packages; } public function is_package_shippable($package) { if (empty($package['destination']['country'])) { return true; } $allowed = array_keys(WC()->countries->get_shipping_countries()); return in_array($package['destination']['country'], $allowed, true); } public function calculate_shipping_for_package($package = array(), $package_key = 0) { if (!$this->enabled || empty($package)) { return false; } $package['rates'] = array(); if (!$this->is_package_shippable($package)) { return $package; } $package_to_hash = $package; foreach ($package_to_hash['contents'] as $item_id => $item) { unset($package_to_hash['contents'][$item_id]['data']); } $wc_session_key = 'shipping_for_package_' . $package_key; $stored_rates = WC()->session->get($wc_session_key); $package_hash = 'wc_ship_' . md5(wp_json_encode($package_to_hash) . WC_Cache_Helper::get_transient_version('shipping')); if (!is_array($stored_rates) || $package_hash !== $stored_rates['package_hash'] || 'yes' === get_option('woocommerce_shipping_debug_mode', 'no')) { foreach ($this->load_shipping_methods($package) as $shipping_method) { if (!$shipping_method->supports('shipping-zones') || $shipping_method->get_instance_id()) { do_action('woocommerce_before_get_rates_for_package', $package, $shipping_method); $package['rates'] = $package['rates'] + $shipping_method->get_rates_for_package($package); do_action('woocommerce_after_get_rates_for_package', $package, $shipping_method); } } $package['rates'] = apply_filters('woocommerce_package_rates', $package['rates'], $package); WC()->session->set($wc_session_key, array('package_hash' => $package_hash, 'rates' => $package['rates'])); } else { $package['rates'] = $stored_rates['rates']; } return $package; } public function get_packages() { return $this->packages; } public function reset_shipping() { unset(WC()->session->chosen_shipping_methods); $this->packages = array(); } public function sort_shipping_methods() { wc_deprecated_function('sort_shipping_methods', '2.6'); return $this->shipping_methods; } }