Since: 2.6.0
Author: WooThemes
 /**
  * Save shipping and tax options.
  */
 public function wc_setup_shipping_taxes_save()
 {
     check_admin_referer('wc-setup');
     $enable_shipping = isset($_POST['woocommerce_calc_shipping']);
     $enable_taxes = isset($_POST['woocommerce_calc_taxes']);
     if ($enable_shipping) {
         update_option('woocommerce_ship_to_countries', '');
     } else {
         update_option('woocommerce_ship_to_countries', 'disabled');
     }
     update_option('woocommerce_calc_taxes', $enable_taxes ? 'yes' : 'no');
     update_option('woocommerce_prices_include_tax', sanitize_text_field($_POST['woocommerce_prices_include_tax']));
     if ($enable_shipping && !empty($_POST['shipping_cost_domestic'])) {
         // Create a domestic shipping zone
         $zone = new WC_Shipping_Zone($zone_data['zone_id']);
         $zone->set_zone_name(__('Domestic', 'woocommerce'));
         $zone->set_zone_order(1);
         $zone->add_location(WC()->countries->get_base_country(), 'country');
         $zone->save();
         // Add a flat rate shipping method to this domestic zone
         $instance_id = $zone->add_shipping_method('flat_rate');
         $shipping_method = new WC_Shipping_Flat_Rate($instance_id);
         $option_key = $shipping_method->get_instance_option_key();
         // Update rate settings
         $costs = array();
         $costs[] = wc_format_decimal(sanitize_text_field($_POST['shipping_cost_domestic']));
         if ($item_cost = sanitize_text_field($_POST['shipping_cost_domestic_item'])) {
             $costs[] = $item_cost . ' * [qty]';
         }
         $shipping_method->instance_settings['cost'] = implode(' + ', array_filter($costs));
         $shipping_method->instance_settings['enabled'] = 'yes';
         $shipping_method->instance_settings['type'] = 'order';
         update_option($option_key, $shipping_method->instance_settings);
     }
     if ($enable_shipping && !empty($_POST['shipping_cost_worldwide'])) {
         // Add a flat rate shipping method to the worldwide zone
         $zone = WC_Shipping_Zones::get_zone(0);
         $instance_id = $zone->add_shipping_method('flat_rate');
         $shipping_method = new WC_Shipping_Flat_Rate($instance_id);
         $option_key = $shipping_method->get_instance_option_key();
         // Update rate settings
         $costs = array();
         $costs[] = wc_format_decimal(sanitize_text_field($_POST['shipping_cost_worldwide']));
         if ($item_cost = sanitize_text_field($_POST['shipping_cost_worldwide_item'])) {
             $costs[] = $item_cost . ' * [qty]';
         }
         $shipping_method->instance_settings['cost'] = implode(' + ', array_filter($costs));
         $shipping_method->instance_settings['enabled'] = 'yes';
         $shipping_method->instance_settings['type'] = 'order';
         update_option($option_key, $shipping_method->instance_settings);
     }
     if ($enable_taxes && !empty($_POST['woocommerce_import_tax_rates'])) {
         $locale_info = (include WC()->plugin_path() . '/i18n/locale-info.php');
         $tax_rates = array();
         $country = WC()->countries->get_base_country();
         $state = WC()->countries->get_base_state();
         if (isset($locale_info[$country])) {
             if (isset($locale_info[$country]['tax_rates'][$state])) {
                 $tax_rates = $locale_info[$country]['tax_rates'][$state];
             } elseif (isset($locale_info[$country]['tax_rates'][''])) {
                 $tax_rates = $locale_info[$country]['tax_rates'][''];
             }
             if (isset($locale_info[$country]['tax_rates']['*'])) {
                 $tax_rates = array_merge($locale_info[$country]['tax_rates']['*'], $tax_rates);
             }
         }
         if ($tax_rates) {
             $loop = 0;
             foreach ($tax_rates as $rate) {
                 $tax_rate = array('tax_rate_country' => $rate['country'], 'tax_rate_state' => $rate['state'], 'tax_rate' => $rate['rate'], 'tax_rate_name' => $rate['name'], 'tax_rate_priority' => isset($rate['priority']) ? absint($rate['priority']) : 1, 'tax_rate_compound' => 0, 'tax_rate_shipping' => $rate['shipping'] ? 1 : 0, 'tax_rate_order' => $loop++, 'tax_rate_class' => '');
                 WC_Tax::_insert_tax_rate($tax_rate);
             }
         }
     }
     wp_redirect(esc_url_raw($this->get_next_step_link()));
     exit;
 }
 /**
  * Retrieve a Shipping Zone by it's ID.
  *
  * @param int $zone_id Shipping Zone ID.
  * @return WC_Shipping_Zone|WP_Error
  */
 protected function get_zone($zone_id)
 {
     $zone = WC_Shipping_Zones::get_zone_by('zone_id', $zone_id);
     if (false === $zone) {
         return new WP_Error('woocommerce_rest_shipping_zone_invalid', __("Resource doesn't exist.", 'woocommerce'), array('status' => 404));
     }
     return $zone;
 }
 /**
  * Get all Shipping Zones.
  *
  * @param WP_REST_Request $request
  * @return WP_REST_Response
  */
 public function get_items($request)
 {
     $rest_of_the_world = WC_Shipping_Zones::get_zone_by('zone_id', 0);
     $zones = WC_Shipping_Zones::get_zones();
     array_unshift($zones, $rest_of_the_world->get_data());
     $data = array();
     foreach ($zones as $zone_obj) {
         $zone = $this->prepare_item_for_response($zone_obj, $request);
         $zone = $this->prepare_response_for_collection($zone);
         $data[] = $zone;
     }
     return rest_ensure_response($data);
 }
 public function __construct($options)
 {
     global $wpdb;
     $this->wpdb = $wpdb;
     $this->import = $options['import'];
     $this->count = $options['count'];
     $this->xml = $options['xml'];
     $this->logger = $options['logger'];
     $this->chunk = $options['chunk'];
     $this->xpath = $options['xpath_prefix'];
     $this->prices_include_tax = 'yes' === get_option('woocommerce_prices_include_tax', 'no');
     $this->payment_gateways = WC_Payment_Gateways::instance()->get_available_payment_gateways();
     $this->shipping_methods = WC()->shipping->get_shipping_methods();
     if (class_exists('WC_Shipping_Zones')) {
         $zones = WC_Shipping_Zones::get_zones();
         if (!empty($zones)) {
             foreach ($zones as $zone_id => $zone) {
                 if (!empty($zone['shipping_methods'])) {
                     foreach ($zone['shipping_methods'] as $method) {
                         $this->shipping_zone_methods[] = $method;
                     }
                 }
             }
         } else {
             $zone = new WC_Shipping_Zone(0);
             $this->shipping_zone_methods = $zone->get_shipping_methods();
         }
     }
     $tax_classes = array_filter(array_map('trim', explode("\n", get_option('woocommerce_tax_classes'))));
     if ($tax_classes) {
         // Add Standard tax class
         if (!in_array('', $tax_classes)) {
             $tax_classes[] = '';
         }
         foreach ($tax_classes as $class) {
             foreach (WC_Tax::get_rates_for_tax_class(sanitize_title($class)) as $rate_key => $rate) {
                 $this->tax_rates[$rate->tax_rate_id] = $rate;
             }
         }
     }
     add_filter('wp_all_import_is_post_to_skip', array(&$this, 'wp_all_import_is_post_to_skip'), 10, 5);
     add_filter('wp_all_import_combine_article_data', array(&$this, 'wp_all_import_combine_article_data'), 10, 4);
 }
 /**
  * Test: WC_Shipping_Zones::get_zone_matching_package
  */
 public function test_get_zone_matching_package()
 {
     // Setup
     WC_Helper_Shipping_Zones::create_mock_zones();
     // Test
     $zone1 = WC_Shipping_Zones::get_zone_matching_package(array('destination' => array('country' => 'GB', 'state' => 'Cambs', 'postcode' => 'CB23 1GG')));
     $zone2 = WC_Shipping_Zones::get_zone_matching_package(array('destination' => array('country' => 'GB', 'state' => 'Cambs', 'postcode' => 'PE12 1BG')));
     $zone3 = WC_Shipping_Zones::get_zone_matching_package(array('destination' => array('country' => 'US', 'state' => 'CA', 'postcode' => '90210')));
     $zone4 = WC_Shipping_Zones::get_zone_matching_package(array('destination' => array('country' => 'US', 'state' => 'AL', 'postcode' => '12345')));
     // Assert
     $this->assertEquals('Local', $zone1->get_zone_name());
     $this->assertEquals('Europe', $zone2->get_zone_name());
     $this->assertEquals('California', $zone3->get_zone_name());
     $this->assertEquals('US', $zone4->get_zone_name());
     // Clean
     WC_Helper_Shipping_Zones::remove_mock_zones();
 }
 /**
  * Get the shipping zone matching a given package from the cart.
  *
  * @since  2.6.0
  * @uses   WC_Shipping_Zones::get_zone_matching_package
  * @param  array $package
  * @return WC_Shipping_Zone
  */
 function wc_get_shipping_zone($package)
 {
     return WC_Shipping_Zones::get_zone_matching_package($package);
 }
 /**
  * Show instance settings
  * @param  int $instance_id
  */
 protected function instance_settings_screen($instance_id)
 {
     $zone = WC_Shipping_Zones::get_zone_by('instance_id', $instance_id);
     $shipping_method = WC_Shipping_Zones::get_shipping_method($instance_id);
     if (!$shipping_method) {
         wp_die(__('Invalid shipping method!', 'woocommerce'));
     }
     if (!$zone) {
         wp_die(__('Zone does not exist!', 'woocommerce'));
     }
     if (!$shipping_method->has_settings()) {
         wp_die(__('This shipping method does not have any settings to configure.', 'woocommerce'));
     }
     if (!empty($_POST['save'])) {
         if (empty($_REQUEST['_wpnonce']) || !wp_verify_nonce($_REQUEST['_wpnonce'], 'woocommerce-settings')) {
             echo '<div class="updated error"><p>' . __('Edit failed. Please try again.', 'woocommerce') . '</p></div>';
         }
         $shipping_method->process_admin_options();
         $shipping_method->display_errors();
     }
     include_once dirname(__FILE__) . '/views/html-admin-page-shipping-zones-instance.php';
 }
 /**
  * Loads all shipping methods which are hooked in. If a $package is passed some methods may add themselves conditionally.
  *
  * Loads all shipping methods which are hooked in.
  * If a $package is passed some methods may add themselves conditionally and zones will be used.
  *
  * @param array $package
  * @return array
  */
 public function load_shipping_methods($package = array())
 {
     if (!empty($package)) {
         $status_options = get_option('woocommerce_status_options', array());
         $shipping_zone = WC_Shipping_Zones::get_zone_matching_package($package);
         $this->shipping_methods = $shipping_zone->get_shipping_methods(true);
         // Debug output
         if (!empty($status_options['shipping_debug_mode']) && !defined('WOOCOMMERCE_CHECKOUT') && !wc_has_notice('Customer matched zone "' . $shipping_zone->get_zone_name() . '"')) {
             wc_add_notice('Customer matched zone "' . $shipping_zone->get_zone_name() . '"');
         }
     } else {
         $this->shipping_methods = array();
     }
     // For the settings in the backend, and for non-shipping zone methods, we still need to load any registered classes here.
     foreach ($this->get_shipping_method_class_names() as $method_id => $method_class) {
         $this->register_shipping_method($method_class);
     }
     // Methods can register themselves manually through this hook if necessary.
     do_action('woocommerce_load_shipping_methods', $package);
     // Return loaded methods
     return $this->get_shipping_methods();
 }
 /**
  * Loads all shipping methods which are hooked in. If a $package is passed some methods may add themselves conditionally.
  *
  * Loads all shipping methods which are hooked in.
  * If a $package is passed some methods may add themselves conditionally and zones will be used.
  *
  * @param array $package
  * @return array
  */
 public function load_shipping_methods($package = array())
 {
     if (!empty($package)) {
         $shipping_zone = WC_Shipping_Zones::get_zone_matching_package($package);
         $this->shipping_methods = $shipping_zone->get_shipping_methods(true);
     } else {
         $this->shipping_methods = array();
     }
     // For the settings in the backend, and for non-shipping zone methods, we still need to load any registered classes here.
     foreach ($this->get_shipping_method_class_names() as $method_id => $method_class) {
         $this->register_shipping_method($method_class);
     }
     // Methods can register themselves manually through this hook if necessary.
     do_action('woocommerce_load_shipping_methods', $package);
     // Return loaded methods
     return $this->get_shipping_methods();
 }
Exemple #10
0
 /**
  * Save method settings
  */
 public static function shipping_zone_methods_save_settings()
 {
     if (!isset($_POST['wc_shipping_zones_nonce'], $_POST['instance_id'], $_POST['data'])) {
         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;
     }
     $instance_id = absint($_POST['instance_id']);
     $zone = WC_Shipping_Zones::get_zone_by('instance_id', $instance_id);
     $shipping_method = WC_Shipping_Zones::get_shipping_method($instance_id);
     $shipping_method->set_post_data($_POST['data']);
     $shipping_method->process_admin_options();
     wp_send_json_success(array('methods' => $zone->get_shipping_methods(), 'errors' => $shipping_method->get_errors()));
 }
 /**
  * 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;
 }
        $page = add_submenu_page('woocommerce', __('Shipping Zones', SHIPPING_ZONES_TEXTDOMAIN), __('Shipping Zones', SHIPPING_ZONES_TEXTDOMAIN), 'manage_woocommerce', 'shipping_zones', array('WC_Shipping_Zones_Admin', 'output'));
        add_action('admin_print_styles-' . $page, array(__CLASS__, 'zones_page_scripts'));
    }
    /**
     * Register the shipping zones screen ID
     * @param array $ids array
     * @return array
     */
    public static function add_screen_id($ids = array())
    {
        $ids[] = strtolower(__('WooCommerce', 'woocommerce')) . '_page_shipping_zones';
        return $ids;
    }
    /**
     * Enqueue scripts and styles
     */
    public static function zones_page_scripts()
    {
        wp_enqueue_style('wc-shipping-zones-styles', plugins_url('/shipping-zones/assets/css/shipping_zones.css', dirname(__FILE__)));
        wp_enqueue_script(SHIPPING_ZONES_TEXTDOMAIN, plugins_url('/shipping-zones/assets/js/shipping-zone-admin.js', dirname(__FILE__)), array('jquery'), '2.0', true);
        wp_localize_script(SHIPPING_ZONES_TEXTDOMAIN, 'wc_shipping_zones_params', array('shipping_zones_nonce' => wp_create_nonce('shipping-zones'), 'supports_select2' => version_compare(WC_VERSION, '2.3', '>') ? 1 : 0));
        if (version_compare(WC_VERSION, '2.3', '<')) {
            wp_enqueue_script('woocommerce_admin');
            wp_enqueue_script('jquery-ui-sortable');
            wp_enqueue_script('chosen');
        }
        do_action('woocommerce_shipping_zones_css');
    }
}
WC_Shipping_Zones::init();
 /**
  * Test: WC_Shipping_Zone::add_shipping_method
  */
 public function test_add_shipping_method()
 {
     // Setup
     WC_Helper_Shipping_Zones::create_mock_zones();
     // Test
     $zone = WC_Shipping_Zones::get_zone(1);
     $zone->add_shipping_method('flat_rate');
     $zone->add_shipping_method('free_shipping');
     // Assert
     $methods = $zone->get_shipping_methods();
     // Assert
     $this->assertTrue(2 === sizeof($methods));
     $this->assertInstanceOf('WC_Shipping_Method', current($methods));
     // Clean
     WC_Helper_Shipping_Zones::remove_mock_zones();
 }
 /**
  * Handle submissions from assets/js/wc-shipping-zone-methods.js Backbone model.
  */
 public static function shipping_zone_add_method()
 {
     if (!isset($_POST['wc_shipping_zones_nonce'], $_POST['zone_id'], $_POST['method_id'])) {
         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;
     }
     // Check User Caps
     if (!current_user_can('manage_woocommerce')) {
         wp_send_json_error('missing_capabilities');
         exit;
     }
     $zone_id = absint($_POST['zone_id']);
     $zone = WC_Shipping_Zones::get_zone($zone_id);
     $instance_id = $zone->add_shipping_method(wc_clean($_POST['method_id']));
     wp_send_json_success(array('instance_id' => $instance_id, 'zone_id' => $zone_id, 'methods' => $zone->get_shipping_methods()));
 }
    /**
     * Create WC Shipping Estimate settings table
     * thanks WC core - modeled off "Shipping Methods" table
     *
     * @since 1.0.0
     */
    public function add_settings()
    {
        // Get the estimates if they're saved already
        $method_estimate_from = get_option('wc_shipping_method_estimate_from', array());
        $method_estimate_to = get_option('wc_shipping_method_estimate_to', array());
        ?>
		<tr valign="top">
			<th scope="row" class="titledesc"><?php 
        esc_html_e('Estimate Ranges', 'woocommerce-shipping-estimate');
        ?>
</th>
			<td class="forminp">
				<table class="wc_shipping widefat wp-list-table" cellspacing="0">
				<?php 
        $zones = WC_Shipping_Zones::get_zones();
        ?>
				<?php 
        if (!empty($zones)) {
            ?>
				<?php 
            foreach ($zones as $zone_id => $zone_data) {
                ?>
					<?php 
                $zone = WC_Shipping_Zones::get_zone($zone_id);
                $zone_methods = $zone->get_shipping_methods();
                if (!empty($zone_methods)) {
                    ?>
					<thead>
						<tr style="background: #e9e9e9;">
							<th colspan="4" style="text-align: center; border: 1px solid #e1e1e1;">
								<?php 
                    echo sprintf('<a href="%1$s">%2$s</a>', esc_url(admin_url('admin.php?page=wc-settings&tab=shipping&zone_id=' . $zone->get_id())), $zone->get_zone_name());
                    ?>
								<?php 
                    esc_html_e('Methods', 'woocommerce-shipping-estimate');
                    ?>
							</th>
						</tr>
						<tr>
							<th class="name" style="padding-left: 2% !important"><?php 
                    esc_html_e('Name', 'woocommerce-shipping-estimate');
                    ?>
</th>
							<th class="type"><?php 
                    esc_html_e('Type', 'woocommerce-shipping-estimate');
                    ?>
</th>
							<th class="day-from"><?php 
                    esc_html_e('From (days)', 'woocommerce-shipping-estimate');
                    ?>
 <?php 
                    echo wc_help_tip(__('The earliest estimated arrival. Can be left blank.', 'woocommerce-shipping-estimate'));
                    ?>
</th>
							<th class="day-to"><?php 
                    esc_html_e('To (days)', 'woocommerce-shipping-estimate');
                    ?>
 <?php 
                    echo wc_help_tip(__('The latest estimated arrival. Can be left blank.', 'woocommerce-shipping-estimate'));
                    ?>
</th>
						</tr>
					</thead>
					<tbody>
					<?php 
                    foreach ($zone->get_shipping_methods() as $instance_id => $method) {
                        ?>
						<tr>
							<td style="padding-left: 2%" class="name">
								<a href="<?php 
                        echo esc_url(admin_url('admin.php?page=wc-settings&tab=shipping&instance_id=' . $instance_id));
                        ?>
"><?php 
                        echo esc_html($method->get_title());
                        ?>
</a>
							</td>
							<td class="type">
								<?php 
                        echo esc_html($method->get_method_title());
                        ?>
							</td>
							<td class="day-from">
								<input type="number" step="1" min="0" name="method_estimate_from[<?php 
                        echo esc_attr($instance_id);
                        ?>
]" value="<?php 
                        echo isset($method_estimate_from[$instance_id]) ? $method_estimate_from[$instance_id] : '';
                        ?>
" />
							</td>
							<td class="day-to">
								<input type="number" step="1" min="0" name="method_estimate_to[<?php 
                        echo esc_attr($instance_id);
                        ?>
]" value="<?php 
                        echo isset($method_estimate_to[$instance_id]) ? $method_estimate_to[$instance_id] : '';
                        ?>
" />
							</td>
						</tr>
					<?php 
                    }
                    ?>
					</tbody>
					<?php 
                }
                ?>
				<?php 
            }
            ?>
				<?php 
        }
        ?>
				
				<?php 
        $world_zone = WC_Shipping_Zones::get_zone(0);
        ?>
				<?php 
        $world_zone_methods = $world_zone->get_shipping_methods();
        ?>
				<?php 
        if (!empty($world_zone_methods)) {
            ?>
					<thead>
						<tr style="background: #e9e9e9;">
							<th colspan="4" style="text-align: center; border: 1px solid #e1e1e1;">
								<?php 
            $zone_name = __('Rest of the World', 'woocommerce-shipping-estimate');
            ?>
								<?php 
            echo sprintf('<a href="%1$s">%2$s</a>', esc_url(admin_url('admin.php?page=wc-settings&tab=shipping&zone_id=0')), $zone_name);
            ?>
								<?php 
            esc_html_e('Methods', 'woocommerce-shipping-estimate');
            ?>
							</th>
						</tr>
						<tr>
							<th class="name" style="padding-left: 2% !important"><?php 
            esc_html_e('Name', 'woocommerce-shipping-estimate');
            ?>
</th>
							<th class="type"><?php 
            esc_html_e('Type', 'woocommerce-shipping-estimate');
            ?>
</th>
							<th class="day-from"><?php 
            esc_html_e('From (days)', 'woocommerce-shipping-estimate');
            ?>
 <?php 
            echo wc_help_tip(__('The earliest estimated arrival. Can be left blank.', 'woocommerce-shipping-estimate'));
            ?>
</th>
							<th class="day-to"><?php 
            esc_html_e('To (days)', 'woocommerce-shipping-estimate');
            ?>
 <?php 
            echo wc_help_tip(__('The latest estimated arrival. Can be left blank.', 'woocommerce-shipping-estimate'));
            ?>
</th>
						</tr>
					</thead>
					<tbody>
					<?php 
            foreach ($world_zone_methods as $instance_id => $method) {
                ?>
						<tr>
							<td style="padding-left: 2%" class="name">
								<a href="<?php 
                echo esc_url(admin_url('admin.php?page=wc-settings&tab=shipping&instance_id=' . $instance_id));
                ?>
"><?php 
                echo esc_html($method->get_title());
                ?>
</a>
							</td>
							<td class="type">
								<?php 
                echo esc_html($method->get_method_title());
                ?>
							</td>
							<td class="day-from">
								<input type="number" step="1" min="0" name="method_estimate_from[<?php 
                echo esc_attr($instance_id);
                ?>
]" value="<?php 
                echo isset($method_estimate_from[$instance_id]) ? $method_estimate_from[$instance_id] : '';
                ?>
" />
							</td>
							<td class="day-to">
								<input type="number" step="1" min="0" name="method_estimate_to[<?php 
                echo esc_attr($instance_id);
                ?>
]" value="<?php 
                echo isset($method_estimate_to[$instance_id]) ? $method_estimate_to[$instance_id] : '';
                ?>
" />
							</td>
						</tr>
					<?php 
            }
            ?>
					</tbody>
					<?php 
        }
        ?>
					<?php 
        $methods = WC()->shipping->get_shipping_methods();
        unset($methods['flat_rate'], $methods['free_shipping'], $methods['local_pickup']);
        if (!empty($methods)) {
            ?>
					<thead>
						<tr style="background: #e9e9e9;">
							<th colspan="4" style="text-align: center; border: 1px solid #e1e1e1;"><?php 
            esc_html_e('Other Methods', 'woocommerce-shipping-estimate');
            ?>
</th>
						</tr>
						<tr>
							<th class="name" style="padding-left: 2% !important"><?php 
            esc_html_e('Name', 'woocommerce-shipping-estimate');
            ?>
</th>
							<th class="id"><?php 
            esc_html_e('ID', 'woocommerce-shipping-estimate');
            ?>
</th>
							<th class="day-from"><?php 
            esc_html_e('From (days)', 'woocommerce-shipping-estimate');
            ?>
 <?php 
            echo wc_help_tip(__('The earliest estimated arrival. Can be left blank.', 'woocommerce-shipping-estimate'));
            ?>
</th>
							<th class="day-to"><?php 
            esc_html_e('To (days)', 'woocommerce-shipping-estimate');
            ?>
 <?php 
            echo wc_help_tip(__('The latest estimated arrival. Can be left blank.', 'woocommerce-shipping-estimate'));
            ?>
</th>
						</tr>
					</thead>
					<tbody>
						<?php 
            foreach ($methods as $method_id => $method) {
                ?>
							<tr>
								<td style="padding-left: 2%" class="name">
									<a href="<?php 
                echo esc_url(admin_url('admin.php?page=wc-settings&tab=shipping&section=' . $method_id));
                ?>
">
									<?php 
                echo esc_html($method->get_title());
                ?>
									</a>
								</td>
								<td class="id">
									<?php 
                echo esc_attr($method->id);
                ?>
								</td>
								<td class="day-from">
									<input type="number" step="1" min="0" name="method_estimate_from[<?php 
                echo esc_attr($method_id);
                ?>
]" value="<?php 
                echo isset($method_estimate_from[$method_id]) ? $method_estimate_from[$method_id] : '';
                ?>
" />
								</td>
								<td width="1%" class="day-to">
									<input type="number" step="1" min="0" name="method_estimate_to[<?php 
                echo esc_attr($method_id);
                ?>
]" value="<?php 
                echo isset($method_estimate_to[$method_id]) ? $method_estimate_to[$method_id] : '';
                ?>
" />
								</td>
							</tr>
						<?php 
            }
            ?>
					</tbody>
					<?php 
        }
        ?>
					<tfoot>
						<tr>
							<th colspan="4" style="padding-left: 2% !important"><span class="description"><?php 
        esc_html_e('Set the estimated range of days required for each method.', 'woocommerce-shipping-estimate');
        ?>
</span></th>
						</tr>
					</tfoot>
				</table>
			</td>
		</tr>
		<?php 
    }