File "class-wc-shipping-zone.php"

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

Download   Open   Edit   Advanced Editor   Back

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