Controls a single zone, loads shipping methods, and registers them for use.
 /**
  * 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;
 }
    /**
     * shipping_zone_methods function.
     * 
     * @access public
     * @return void
     */
    function shipping_zone_methods($zone_id)
    {
        global $woocommerce, $wpdb;
        $zone = new WC_Shipping_Zone($zone_id);
        if (!$zone->exists()) {
            wp_redirect(remove_query_arg('zone'));
            exit;
        }
        if (!empty($_GET['add_method']) && !empty($_GET['method_type']) && !empty($_GET['_wpnonce']) && wp_verify_nonce($_GET['_wpnonce'], 'woocommerce_add_method')) {
            $type = strtolower(trim($_GET['method_type']));
            if ($method_id = $zone->add_shipping_method($type)) {
                wp_redirect(add_query_arg('method', $method_id, add_query_arg('zone', $zone_id, admin_url('admin.php?page=shipping_zones'))));
                exit;
                //echo '<div class="updated success"><p>' . __( 'Shipping method successfully added', 'wc_table_rate' ) . ' <a href="' . add_query_arg( 'method', $method_id, add_query_arg( 'zone', $zone_id, admin_url( 'admin.php?page=shipping_zones' ) ) ) . '" class="button" style="margin-left: 10px;">' . __( 'Configure method', 'wc_table_rate' ) . '</a></p></div>';
            }
        }
        if (!empty($_GET['delete_method']) && !empty($_GET['_wpnonce']) && wp_verify_nonce($_GET['_wpnonce'], 'woocommerce_delete_method')) {
            $method_id = absint($_GET['delete_method']);
            if ($zone->delete_shipping_method($method_id)) {
                echo '<div class="updated success"><p>' . __('Shipping method successfully deleted', 'wc_table_rate') . '</p></div>';
            }
        }
        if (!empty($_GET['method']) && $_GET['method'] > 0) {
            $method_id = (int) $_GET['method'];
            $this->shipping_zone_method_settings($zone, $method_id);
            return;
        }
        ?>
		<div class="wrap woocommerce">
			<div class="icon32 icon32-woocommerce-delivery" id="icon-woocommerce"><br /></div>
			<h2><a href="<?php 
        echo admin_url('admin.php?page=shipping_zones');
        ?>
"><?php 
        _e('Shipping Zones', 'wc_table_rate');
        ?>
</a> &gt; <?php 
        echo $zone->zone_name;
        ?>
 <a href="<?php 
        echo wp_nonce_url(add_query_arg('method_type', 'table_rate', add_query_arg('add_method', 'true')), 'woocommerce_add_method');
        ?>
" class="add-new-h2"><?php 
        _e('Add Shipping Method', 'wc_table_rate');
        ?>
</a></h2>
			
			<?php 
        $this->list_shipping_zone_methods();
        ?>
	
		</div>
		<?php 
        $woocommerce->add_inline_js("\n\t\t\t// Delete\n\t\t\tjQuery('a.submitdelete').click( function(){\n\t\t\t\tvar answer = confirm('" . __('Are you sure you want to delete this method?', 'wc_table_rate') . "');\n\t\t\t\tif ( answer ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\t\t");
    }
 /**
  * Create some mock shipping zones to test against
  */
 public static function create_mock_zones()
 {
     self::remove_mock_zones();
     // Local zone
     $zone = new WC_Shipping_Zone();
     $zone->set_zone_name('Local');
     $zone->set_zone_order(1);
     $zone->add_location('GB', 'country');
     $zone->add_location('CB*', 'postcode');
     $zone->save();
     // Europe zone
     $zone = new WC_Shipping_Zone();
     $zone->set_zone_name('Europe');
     $zone->set_zone_order(2);
     $zone->add_location('EU', 'continent');
     $zone->save();
     // US california zone
     $zone = new WC_Shipping_Zone();
     $zone->set_zone_name('California');
     $zone->set_zone_order(3);
     $zone->add_location('US:CA', 'state');
     $zone->save();
     // US zone
     $zone = new WC_Shipping_Zone();
     $zone->set_zone_name('US');
     $zone->set_zone_order(4);
     $zone->add_location('US', 'country');
     $zone->save();
 }
 /**
  * view_zone_page function.
  */
 public static function view_zone_screen()
 {
     global $wpdb;
     $zone_id = absint($_GET['zone']);
     $zone = new WC_Shipping_Zone($zone_id);
     if (!$zone->exists()) {
         echo '<div class="error"><p>' . sprintf(__('Invalid shipping zone. <a href="%s">Back to zones.</a>', SHIPPING_ZONES_TEXTDOMAIN), esc_url(remove_query_arg('zone'))) . '</p></div>';
         return;
     }
     self::add_method($zone);
     self::delete_method($zone);
     if (!empty($_GET['method'])) {
         self::method_settings($zone, absint($_GET['method']));
         return;
     } else {
         include 'views/html-zone-methods.php';
     }
 }
 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);
 }
Example #6
0
 /**
  * Helper method to create a Shipping Zone.
  *
  * @param string $name Zone name.
  * @param int    $order Optional. Zone sort order.
  * @return WC_Shipping_Zone
  */
 protected function create_shipping_zone($name, $order = 0, $locations = array())
 {
     $zone = new WC_Shipping_Zone(null);
     $zone->set_zone_name($name);
     $zone->set_zone_order($order);
     $zone->set_locations($locations);
     $zone->save();
     $this->zones[] = $zone;
     return $zone;
 }
 /**
  * Create a single Shipping Zone.
  *
  * @param WP_REST_Request $request Full details about the request.
  * @return WP_REST_Request|WP_Error
  */
 public function create_item($request)
 {
     $zone = new WC_Shipping_Zone(null);
     if (!is_null($request->get_param('name'))) {
         $zone->set_zone_name($request->get_param('name'));
     }
     if (!is_null($request->get_param('order'))) {
         $zone->set_zone_order($request->get_param('order'));
     }
     $zone->create();
     if ($zone->get_id() !== 0) {
         $request->set_param('id', $zone->get_id());
         $response = $this->get_item($request);
         $response->set_status(201);
         $response->header('Location', rest_url(sprintf('/%s/%s/%d', $this->namespace, $this->rest_base, $zone->get_id())));
         return $response;
     } else {
         return new WP_Error('woocommerce_rest_shipping_zone_not_created', __("Resource cannot be created. Check to make sure 'order' and 'name' are present.", 'woocommerce'), array('status' => 500));
     }
 }
 /**
  * Delete a zone using it's ID
  * @param int $zone_id
  * @since 2.6.0
  */
 public static function delete_zone($zone_id)
 {
     $zone = new WC_Shipping_Zone($zone_id);
     $zone->delete();
 }
?>
</a>
                <div class="row-actions">
                    <a href="admin.php?page=wc-settings&amp;tab=shipping&amp;zone_id={{ data.zone_id }}"><?php 
_e('Edit Shipping Methods', 'woocommerce');
?>
</a>
                </div>
            </td>
            <td class="wc-shipping-zone-region"><?php 
esc_html_e('Shipping Methods added here will apply to shipping addresses that aren&lsquo;t included in any other Shipping Zone.', 'woocommerce');
?>
</td>
            <td class="wc-shipping-zone-methods">
				<?php 
$worldwide = new WC_Shipping_Zone(0);
$methods = $worldwide->get_shipping_methods();
if (!$methods) {
    echo '<ul><li><a href="#" class="add_shipping_method button">' . __('Add Shipping Method', 'woocommerce') . '</a></li></ul>';
} else {
    echo '<ul>';
    foreach ($methods as $method) {
        $class_name = 'yes' === $method->enabled ? 'method_enabled' : 'method_disabled';
        echo '<li><a href="admin.php?page=wc-settings&amp;tab=shipping&amp;instance_id=' . absint($method->instance_id) . '" class="' . esc_attr($class_name) . '">' . esc_html($method->get_title()) . '</a></li>';
    }
    echo '<li><a href="#" class="add_shipping_method button">' . __('Add Shipping Method', 'woocommerce') . '</a></li>';
    echo '</ul>';
}
?>
			</td>
            <td class="wc-shipping-zone-actions"></td>
Example #10
0
 /**
  * Handle submissions from assets/js/wc-shipping-zone-methods.js Backbone model.
  */
 public static function shipping_zone_methods_save_changes()
 {
     if (!isset($_POST['wc_shipping_zones_nonce'], $_POST['zone_id'], $_POST['changes'])) {
         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;
     }
     global $wpdb;
     $zone_id = absint($_POST['zone_id']);
     $zone = new WC_Shipping_Zone($zone_id);
     $changes = $_POST['changes'];
     foreach ($changes as $instance_id => $data) {
         $method_id = $wpdb->get_var($wpdb->prepare("SELECT method_id FROM {$wpdb->prefix}woocommerce_shipping_zone_methods WHERE instance_id = %d", $instance_id));
         if (isset($data['deleted'])) {
             if ($wpdb->delete("{$wpdb->prefix}woocommerce_shipping_zone_methods", array('instance_id' => $instance_id))) {
                 do_action('woocommerce_shipping_zone_method_deleted', $instance_id, $method_id, $zone_id);
             }
             continue;
         }
         $method_data = array_intersect_key($data, array('method_order' => 1, 'enabled' => 1));
         if (isset($method_data['method_order'])) {
             $wpdb->update("{$wpdb->prefix}woocommerce_shipping_zone_methods", array('method_order' => absint($method_data['method_order'])), array('instance_id' => absint($instance_id)));
         }
         if (isset($method_data['enabled'])) {
             $is_enabled = absint('yes' === $method_data['enabled']);
             if ($wpdb->update("{$wpdb->prefix}woocommerce_shipping_zone_methods", array('is_enabled' => $is_enabled), array('instance_id' => absint($instance_id)))) {
                 do_action('woocommerce_shipping_zone_method_status_toggled', $instance_id, $method_id, $zone_id, $is_enabled);
             }
         }
     }
     wp_send_json_success(array('methods' => $zone->get_shipping_methods()));
 }
Example #11
0
 /**
  * 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;
 }
Example #12
0
 /**
  * Handle submissions from assets/js/wc-shipping-zone-methods.js Backbone model.
  */
 public static function shipping_zone_methods_save_changes()
 {
     if (!isset($_POST['wc_shipping_zones_nonce'], $_POST['zone_id'], $_POST['changes'])) {
         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;
     }
     global $wpdb;
     $zone_id = wc_clean($_POST['zone_id']);
     $zone = new WC_Shipping_Zone($zone_id);
     $changes = $_POST['changes'];
     if (isset($changes['zone_name'])) {
         $zone->set_zone_name(wc_clean($changes['zone_name']));
     }
     if (isset($changes['zone_locations'])) {
         $zone->clear_locations(array('state', 'country', 'continent'));
         $locations = array_filter(array_map('wc_clean', (array) $changes['zone_locations']));
         foreach ($locations as $location) {
             // Each posted location will be in the format type:code
             $location_parts = explode(':', $location);
             switch ($location_parts[0]) {
                 case 'state':
                     $zone->add_location($location_parts[1] . ':' . $location_parts[2], 'state');
                     break;
                 case 'country':
                     $zone->add_location($location_parts[1], 'country');
                     break;
                 case 'continent':
                     $zone->add_location($location_parts[1], 'continent');
                     break;
             }
         }
     }
     if (isset($changes['zone_postcodes'])) {
         $zone->clear_locations('postcode');
         $postcodes = array_filter(array_map('strtoupper', array_map('wc_clean', explode("\n", $changes['zone_postcodes']))));
         foreach ($postcodes as $postcode) {
             $zone->add_location($postcode, 'postcode');
         }
     }
     if (isset($changes['methods'])) {
         foreach ($changes['methods'] as $instance_id => $data) {
             $method_id = $wpdb->get_var($wpdb->prepare("SELECT method_id FROM {$wpdb->prefix}woocommerce_shipping_zone_methods WHERE instance_id = %d", $instance_id));
             if (isset($data['deleted'])) {
                 $shipping_method = WC_Shipping_Zones::get_shipping_method($instance_id);
                 $option_key = $shipping_method->get_instance_option_key();
                 if ($wpdb->delete("{$wpdb->prefix}woocommerce_shipping_zone_methods", array('instance_id' => $instance_id))) {
                     delete_option($option_key);
                     do_action('woocommerce_shipping_zone_method_deleted', $instance_id, $method_id, $zone_id);
                 }
                 continue;
             }
             $method_data = array_intersect_key($data, array('method_order' => 1, 'enabled' => 1));
             if (isset($method_data['method_order'])) {
                 $wpdb->update("{$wpdb->prefix}woocommerce_shipping_zone_methods", array('method_order' => absint($method_data['method_order'])), array('instance_id' => absint($instance_id)));
             }
             if (isset($method_data['enabled'])) {
                 $is_enabled = absint('yes' === $method_data['enabled']);
                 if ($wpdb->update("{$wpdb->prefix}woocommerce_shipping_zone_methods", array('is_enabled' => $is_enabled), array('instance_id' => absint($instance_id)))) {
                     do_action('woocommerce_shipping_zone_method_status_toggled', $instance_id, $method_id, $zone_id, $is_enabled);
                 }
             }
         }
     }
     $zone->save();
     wp_send_json_success(array('zone_id' => $zone->get_id(), 'zone_name' => $zone->get_zone_name(), 'methods' => $zone->get_shipping_methods()));
 }
 /**
  * Show method for a zone
  * @param  int $zone_id
  */
 protected function zone_methods_screen($zone_id)
 {
     if ('new' === $zone_id) {
         $zone = new WC_Shipping_Zone();
         $zone->set_zone_name('');
     } else {
         $zone = WC_Shipping_Zones::get_zone(absint($zone_id));
     }
     if (!$zone) {
         wp_die(__('Zone does not exist!', 'woocommerce'));
     }
     $allowed_countries = WC()->countries->get_allowed_countries();
     $wc_shipping = WC_Shipping::instance();
     $shipping_methods = $wc_shipping->get_shipping_methods();
     $continents = WC()->countries->get_continents();
     // Prepare locations
     $locations = array();
     $postcodes = array();
     foreach ($zone->get_zone_locations() as $location) {
         if ('postcode' === $location->type) {
             $postcodes[] = $location->code;
         } else {
             $locations[] = $location->type . ':' . $location->code;
         }
     }
     wp_localize_script('wc-shipping-zone-methods', 'shippingZoneMethodsLocalizeScript', array('methods' => $zone->get_shipping_methods(), 'zone_name' => $zone->get_zone_name(), 'zone_id' => $zone->get_id(), 'wc_shipping_zones_nonce' => wp_create_nonce('wc_shipping_zones_nonce'), 'strings' => array('unload_confirmation_msg' => __('Your changed data will be lost if you leave this page without saving.', 'woocommerce'), 'save_changes_prompt' => __('Do you wish to save your changes first? Your changed data will be discarded if you choose to cancel.', 'woocommerce'), 'save_failed' => __('Your changes were not saved. Please retry.', 'woocommerce'), 'add_method_failed' => __('Shipping method could not be added. Please retry.', 'woocommerce'), 'yes' => __('Yes', 'woocommerce'), 'no' => __('No', 'woocommerce'))));
     wp_enqueue_script('wc-shipping-zone-methods');
     include_once dirname(__FILE__) . '/views/html-admin-page-shipping-zone-methods.php';
 }
Example #14
-2
 /**
  * Test legacy zone functions.
  *
  * @since 2.7.0
  *
  * @expectedDeprecated WC_Shipping_Zone::read
  * @expectedDeprecated WC_Shipping_Zone::create
  * @expectedDeprecated WC_Shipping_Zone::update
  */
 public function test_wc_shipping_zone_legacy()
 {
     // Create a single zone.
     $zone = new WC_Shipping_Zone();
     $zone->set_zone_name('Local');
     $zone->set_zone_order(1);
     $zone->add_location('GB', 'country');
     $zone->add_location('CB*', 'postcode');
     $zone->save();
     $zone_id = $zone->get_id();
     $zone_read = new WC_Shipping_Zone();
     $zone_read->read($zone_id);
     $this->assertEquals($zone_id, $zone_read->get_id());
     $zone = new WC_Shipping_Zone();
     $zone->set_zone_name('Test');
     $zone->set_zone_order(2);
     $zone->create();
     $this->assertEquals('Test', $zone->get_zone_name());
     $this->assertNotEmpty($zone->get_id());
     $zone->set_zone_name('Test 2');
     $zone->update();
     $this->assertEquals('Test 2', $zone->get_zone_name());
 }