File "class-wc-shipping.php"

Full path: /home/kosmetik/public_html/wp-content/plugins/woocommerce/includes/class-wc-shipping.php
File size: 7.02 B
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor   Back

<?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;
    }
}