Support » Plugin: AWD Weight/Country Shipping for WooCommerce » New plugin for testing for Woocommerce 2.1

  • PozHonks

    (@pozhonks)


    Hi guys, I have written a new plugin and IT WORKS (at least it works for me). What I did is using a working plugin, WOOWBS, and add the specific AWD codes into it. So, it is a simple copy and paste with a few fixes. Nothing more. I have not included the option “Add countries to allowed” to keep it simple (just do a good settings in woocommerce instead).

    Please note: I am not a developer and I don’t want to support this plugin and update it. If someone wants to take it officially, please do it.

    Create a file named: woocommerce-wrtc-shipping.php and insert the following code:

    <?php
    /**
     * Plugin Name: Weight and Country Table Rate shipping for Woocommerce
     * Description: WCTR is a weight and country based shipping method for Woocommerce 2.1, based on <a href="http://www.andyswebdesign.ie/blog/free-woocommerce-weight-and-country-based-shipping-extension-plugin/">AWD</a> and <a href="http://wordpress.org/plugins/weight-based-shipping-for-woocommerce/">WOOWBS</a>
     * Version: 1.0
     * Author:
     */
    /*  Copyright 2012  
    
        This program is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License, version 2, as
        published by the Free Software Foundation.
    
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
        along with this program; if not, write to the Free Software
        Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    */
    
    add_action( 'plugins_loaded', 'init_woowctr', 0 );
    
    function init_woowctr() {
    
    	if ( ! class_exists( 'WC_Shipping_Method' ) ) return;
    
    	class WCTR_Shipping extends WC_Shipping_Method {
    
    		function __construct() {
    			$this->id           = 'WCTR_Shipping';
    			$this->method_title = __( 'Table Rate', 'woocommerce' );
    
    			$this->admin_page_heading     = __( 'Weight and country based shipping', 'woocommerce' );
    			$this->admin_page_description = __( 'Define shipping by weight and country', 'woocommerce' );
    
    			add_action( 'woocommerce_update_options_shipping_' . $this->id, array( &$this, 'process_admin_options' ) );
    
    			$this->init();
    			$this->display_country_groups();
    		}
    
    		function init() {
    			$this->init_form_fields();
    			$this->init_settings();
    
    			$this->enabled          = $this->get_option('enabled');
    			$this->title            = $this->get_option('title');
                $this->availability     = 'specific';
    			$this->country_group_no	= $this->get_option('country_group_no');
                $this->countries 	    = $this->get_option('countries');
    			$this->type             = 'order';
    			$this->tax_status       = $this->get_option('tax_status');
    			$this->fee              = $this->get_option('fee');
    			$this->rate			= isset( $this->settings['rate'] ) ? $this->settings['rate'] : '';
    			$this->rate			= (array) explode( "\n", $this->rate );
    
                if (empty($this->countries)) {
                    $this->availability = $this->settings['availability'] = 'all';
                }
    		}
    
    		function init_form_fields() {
    
                $woocommerce = function_exists('WC') ? WC() : $GLOBALS['woocommerce'];
    
    			$this->form_fields = array(
    				'enabled'    => array(
    					'title'   => __( 'Enable/Disable', 'woocommerce' ),
    					'type'    => 'checkbox',
    					'label'   => __( 'Enable this shipping method', 'woocommerce' ),
    					'default' => 'no',
    				),
    				'title'      => array(
    					'title'       => __( 'Method Title', 'woocommerce' ),
    					'type'        => 'text',
    					'description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce' ),
    					'default'     => __( 'Regular Shipping', 'woocommerce' ),
    				),
    				'tax_status' => array(
    					'title'       => __( 'Tax Status', 'woocommerce' ),
    					'type'        => 'select',
    					'description' => '',
    					'default'     => 'taxable',
    					'options'     => array(
    						'taxable' => __( 'Taxable', 'woocommerce' ),
    						'none'    => __( 'None', 'woocommerce' ),
    					),
    				),
    				'fee'        => array(
    					'title'       => __( 'Handling Fee', 'woocommerce' ),
    					'type'        => 'text',
    					'description' => __( 'Fee excluding tax, e.g. 3.50. Leave blank to disable.', 'woocommerce' ),
    					'default'     => '',
    				),
    				'rate'       => array(
    					'title'       => __( 'Shipping Rates', 'woocommerce' ),
    					'type'        => 'textarea',
    					'description' => __( 'Set your weight based rates in ' . get_option( 'woocommerce_weight_unit' ) . ' for country groups (one per line). Example: <code>Max weight|Cost|country group number</code>. Example: <code>10|6.95|3</code>. For decimal, use a dot not a comma.', 'woocommerce' ),
    					'default'     => '',
    				),
    				'country_group_no' => array(
    					'title' 		=> __( 'Number of country groups', 'woocommerce' ),
    					'type' 			=> 'text',
    					'description'	=> __( 'Number of groups of countries sharing delivery rates (hit "Save changes" button after you have changed this setting).' ),
    					'default' 		=> '3',
    				),
    
    			);
    		}
    
        /*
        * Displays country group selects in shipping method's options
        */
        function display_country_groups() {
    
    		$woocommerce = function_exists('WC') ? WC() : $GLOBALS['woocommerce'];
    		$shippingCountries = method_exists($woocommerce->countries, 'get_shipping_countries')
                                        ? $woocommerce->countries->get_shipping_countries()
                                        : $woocommerce->countries->countries;
        //   echo prp($this->settings['countries1']);
            $number = $this->country_group_no;
            for($counter = 1; $number >= $counter; $counter++) {
    
                $this->form_fields['countries'.$counter] =  array(
                        'title'     => sprintf(__( 'Country Group %s', 'woocommerce' ), $counter),
                        'type'      => 'multiselect',
                        'class'     => 'chosen_select',
                        'css'       => 'width: 450px;',
                        'default'   => '',
                        'options'   => $shippingCountries
                );
            }
        }
    
    		function calculate_shipping( $package = array() ) {
    
    			global $woocommerce;
    
                $rates      = $this->get_rates_by_countrygroup($this->get_countrygroup($package));
                $weight     = $woocommerce->cart->cart_contents_weight;
                $final_rate = $this->pick_smallest_rate($rates, $weight);
    
                if($final_rate === false) return false;
    
                $taxable    = ($this->tax_status == 'taxable') ? true : false;
    
                if($this->fee > 0 && $package['destination']['country']) $final_rate = $final_rate + $this->fee;
    
                    $rate = array(
                    'id'        => $this->id,
                    'label'     => $this->title,
                    'cost'      => $final_rate,
                    'taxes'     => '',
                    'calc_tax'  => 'per_order'
                    );
    
            $this->add_rate( $rate );
        }
    
        /*
        * Retrieves the number of country group for country selected by user on checkout
        */
        function get_countrygroup($package = array()) {    
    
                $counter = 1;
    
                while(is_array($this->settings['countries'.$counter])) {
                    if (in_array($package['destination']['country'], $this->settings['countries'.$counter]))
                        $country_group = $counter;
    
                    $counter++;
                }
            return $country_group;
        }
    
        /*
        * Retrieves all rates available for selected country group
        */
        function get_rates_by_countrygroup($country_group = null) {
    
            $rates = array();
                    if ( sizeof( $this->rate ) > 0) foreach ( $this->rate as $option => $value ) {
    
                        $rate = preg_split( '~\s*\|\s*~', trim( $value ) );
    
                        if ( sizeof( $rate ) !== 3 )  {
                            continue;
                        } else {
                            $rates[] = $rate;
    
                        }
                    }
    
                    foreach($rates as $key) {
                        if($key[2] == $country_group) {
                            $countrygroup_rate[] = $key;
                        }
                    }
            return $countrygroup_rate;
        }
    
        /*
        * Picks the right rate from available rates based on cart weight
        */
        function pick_smallest_rate($rates,$weight) {
    
        if($weight == 0) return 0; // no shipping for cart without weight
    
            if( sizeof($rates) > 0) foreach($rates as $key => $value) {
    
                    if($weight <= $value[0]) {
                        $postage[] = $value[1];
                    }
                    $postage_all_rates[] = $value[1];
            }
    
            if(sizeof($postage) > 0) {
                return min($postage);
                    } else {
                    if (sizeof($postage_all_rates) > 0) return max($postage_all_rates);
                    }
            return false;
        }
    
    		public function admin_options() {
    			?>
    				<h3><?php _e( 'Weight and Country based Table Rates shipping', 'woocommerce' ); ?></h3>
    				<p><?php _e( 'Lets you calculate shipping based on country and weight of the cart. Lets you set unlimited weight bands on per country basis and group countries that share same delivery cost/bands.', 'woocommerce' ); ?></p>
    				<table class="form-table">
    					<?php $this->generate_settings_html(); ?>
    				</table>
    			<?php
    		}
    	}
    }
    
    function add_woowctr( $methods ) {
    	$methods[] = 'WCTR_Shipping';
    	return $methods;
    }
    
    add_filter( 'woocommerce_shipping_methods', 'add_woowctr' );
    
    ?>

    https://wordpress.org/plugins/awd-weightcountry-shipping/

Viewing 9 replies - 1 through 9 (of 9 total)
  • PozHonks

    (@pozhonks)

    For those who are interested, I have written a second plugin based on the first one for Express Mail. Indeed, I use the first table rate for regular mail, and I need a second table rate for express mail.

    Create a file named: woocommerce-wrtc-shipping2.php and insert the following code:

    <?php
    /**
     * Plugin Name: Weight and Country Table Rate Express Mail for Woocommerce
     * Description: WCTR for Express Mail is a weight and country based shipping method for Woocommerce 2.1, based on <a href="http://www.andyswebdesign.ie/blog/free-woocommerce-weight-and-country-based-shipping-extension-plugin/">AWD</a> and <a href="http://wordpress.org/plugins/weight-based-shipping-for-woocommerce/">WOOWBS</a>.
     * Version: 1.0
     * Author:
     */
    /*  Copyright 2012  
    
        This program is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License, version 2, as
        published by the Free Software Foundation.
    
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
        along with this program; if not, write to the Free Software
        Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    */
    
    /* MODIF */ add_action( 'plugins_loaded', 'init_woowctr2', 0 );
    
    /* MODIF */ function init_woowctr2() {
    
    	if ( ! class_exists( 'WC_Shipping_Method' ) ) return;
    
    /* MODIF */ 	class WCTR_Shipping2 extends WC_Shipping_Method {
    
    		function __construct() {
    /* MODIF */ 			$this->id           = 'WCTR_Shipping2';
    /* MODIF */ 			$this->method_title = __( 'Table Rate for Express Mail', 'woocommerce' );
    
    			$this->admin_page_heading     = __( 'Weight and country based shipping', 'woocommerce' );
    			$this->admin_page_description = __( 'Define shipping by weight and country', 'woocommerce' );
    
    			add_action( 'woocommerce_update_options_shipping_' . $this->id, array( &$this, 'process_admin_options' ) );
    
    			$this->init();
    			$this->display_country_groups();
    		}
    
    		function init() {
    			$this->init_form_fields();
    			$this->init_settings();
    
    			$this->enabled          = $this->get_option('enabled');
    			$this->title            = $this->get_option('title');
                $this->availability     = 'specific';
    			$this->country_group_no	= $this->get_option('country_group_no');
                $this->countries 	    = $this->get_option('countries');
    			$this->type             = 'order';
    			$this->tax_status       = $this->get_option('tax_status');
    			$this->fee              = $this->get_option('fee');
    			$this->rate			= isset( $this->settings['rate'] ) ? $this->settings['rate'] : '';
    			$this->rate			= (array) explode( "\n", $this->rate );
    
                if (empty($this->countries)) {
                    $this->availability = $this->settings['availability'] = 'all';
                }
    		}
    
    		function init_form_fields() {
    
                $woocommerce = function_exists('WC') ? WC() : $GLOBALS['woocommerce'];
    
    			$this->form_fields = array(
    				'enabled'    => array(
    					'title'   => __( 'Enable/Disable', 'woocommerce' ),
    					'type'    => 'checkbox',
    					'label'   => __( 'Enable this shipping method', 'woocommerce' ),
    					'default' => 'no',
    				),
    				'title'      => array(
    					'title'       => __( 'Method Title', 'woocommerce' ),
    					'type'        => 'text',
    					'description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce' ),
    					'default'     => __( 'Express Mail', 'woocommerce' ),
    				),
    				'tax_status' => array(
    					'title'       => __( 'Tax Status', 'woocommerce' ),
    					'type'        => 'select',
    					'description' => '',
    					'default'     => 'taxable',
    					'options'     => array(
    						'taxable' => __( 'Taxable', 'woocommerce' ),
    						'none'    => __( 'None', 'woocommerce' ),
    					),
    				),
    				'fee'        => array(
    					'title'       => __( 'Handling Fee', 'woocommerce' ),
    					'type'        => 'text',
    					'description' => __( 'Fee excluding tax, e.g. 3.50. Leave blank to disable.', 'woocommerce' ),
    					'default'     => '',
    				),
    				'rate'       => array(
    					'title'       => __( 'Shipping Rates', 'woocommerce' ),
    					'type'        => 'textarea',
    					'description' => __( 'Set your weight based rates in ' . get_option( 'woocommerce_weight_unit' ) . ' for country groups (one per line). Example: <code>Max weight|Cost|country group number</code>. Example: <code>10|6.95|3</code>. For decimal, use a dot not a comma.', 'woocommerce' ),
    					'default'     => '',
    				),
    				'country_group_no' => array(
    					'title' 		=> __( 'Number of country groups', 'woocommerce' ),
    					'type' 			=> 'text',
    					'description'	=> __( 'Number of groups of countries sharing delivery rates (hit "Save changes" button after you have changed this setting).' ),
    					'default' 		=> '3',
    				),
    
    			);
    		}
    
        /*
        * Displays country group selects in shipping method's options
        */
        function display_country_groups() {
    
    		$woocommerce = function_exists('WC') ? WC() : $GLOBALS['woocommerce'];
    		$shippingCountries = method_exists($woocommerce->countries, 'get_shipping_countries')
                                        ? $woocommerce->countries->get_shipping_countries()
                                        : $woocommerce->countries->countries;
        //   echo prp($this->settings['countries1']);
            $number = $this->country_group_no;
            for($counter = 1; $number >= $counter; $counter++) {
    
                $this->form_fields['countries'.$counter] =  array(
                        'title'     => sprintf(__( 'Country Group %s', 'woocommerce' ), $counter),
                        'type'      => 'multiselect',
                        'class'     => 'chosen_select',
                        'css'       => 'width: 450px;',
                        'default'   => '',
                        'options'   => $shippingCountries
                );
            }
        }
    
    		function calculate_shipping( $package = array() ) {
    
    			global $woocommerce;
    
                $rates      = $this->get_rates_by_countrygroup($this->get_countrygroup($package));
                $weight     = $woocommerce->cart->cart_contents_weight;
                $final_rate = $this->pick_smallest_rate($rates, $weight);
    
                if($final_rate === false) return false;
    
                $taxable    = ($this->tax_status == 'taxable') ? true : false;
    
                if($this->fee > 0 && $package['destination']['country']) $final_rate = $final_rate + $this->fee;
    
                    $rate = array(
                    'id'        => $this->id,
                    'label'     => $this->title,
                    'cost'      => $final_rate,
                    'taxes'     => '',
                    'calc_tax'  => 'per_order'
                    );
    
            $this->add_rate( $rate );
        }
    
        /*
        * Retrieves the number of country group for country selected by user on checkout
        */
        function get_countrygroup($package = array()) {    
    
                $counter = 1;
    
                while(is_array($this->settings['countries'.$counter])) {
                    if (in_array($package['destination']['country'], $this->settings['countries'.$counter]))
                        $country_group = $counter;
    
                    $counter++;
                }
            return $country_group;
        }
    
        /*
        * Retrieves all rates available for selected country group
        */
        function get_rates_by_countrygroup($country_group = null) {
    
            $rates = array();
                    if ( sizeof( $this->rate ) > 0) foreach ( $this->rate as $option => $value ) {
    
                        $rate = preg_split( '~\s*\|\s*~', trim( $value ) );
    
                        if ( sizeof( $rate ) !== 3 )  {
                            continue;
                        } else {
                            $rates[] = $rate;
    
                        }
                    }
    
                    foreach($rates as $key) {
                        if($key[2] == $country_group) {
                            $countrygroup_rate[] = $key;
                        }
                    }
            return $countrygroup_rate;
        }
    
        /*
        * Picks the right rate from available rates based on cart weight
        */
        function pick_smallest_rate($rates,$weight) {
    
        if($weight == 0) return 0; // no shipping for cart without weight
    
            if( sizeof($rates) > 0) foreach($rates as $key => $value) {
    
                    if($weight <= $value[0]) {
                        $postage[] = $value[1];
                    }
                    $postage_all_rates[] = $value[1];
            }
    
            if(sizeof($postage) > 0) {
                return min($postage);
                    } else {
                    if (sizeof($postage_all_rates) > 0) return max($postage_all_rates);
                    }
            return false;
        }
    
    		public function admin_options() {
    			?>
    				<h3><?php _e( 'Weight and Country based Table Rates shipping', 'woocommerce' ); ?></h3>
    				<p><?php _e( 'Lets you calculate shipping based on country and weight of the cart. Lets you set unlimited weight bands on per country basis and group countries that share same delivery cost/bands.', 'woocommerce' ); ?></p>
    				<table class="form-table">
    					<?php $this->generate_settings_html(); ?>
    				</table>
    			<?php
    		}
    	}
    }
    
    /* MODIF */ function add_woowctr2( $methods ) {
    /* MODIF */ 	$methods[] = 'WCTR_Shipping2';
    	return $methods;
    }
    
    /* MODIF */ add_filter( 'woocommerce_shipping_methods', 'add_woowctr2' );
    
    ?>
    Linda Fitzpatrick

    (@linda-fitzpatrick)

    That’s just fantastic. I just used that on a site that we had an issue with AWD Weight and Country Plugin on.

    I didn’t even create a new plugin, just pasted the relevant code you gave above into the WOOWBS .php and it works perfectly.

    Thank you very much!

    PozHonks

    (@pozhonks)

    Thank you. You give me an idea on how to easily update the plugin and replace the AWD code without losing any settings:

    THIS IS THE SOLUTION YOU ARE LOOKING FOR:
    So, paste the code into the shipping-awd.php file. You don’t have to open a text editor, you can edit the plugin code in the WordPress admin area. Yes, replace the old AWD code with this one:

    <?php
    /**
     * Plugin Name: AWD Weight/Country Shipping
     * Plugin URI: http://www.andyswebdesign.ie/blog/free-woocommerce-weight-and-country-based-shipping-extension-plugin/
     * Description: Unofficial update for WooCommerce 2.1. Weight and Country based shipping method for Woocommerce.
     * Version: 1.0.2b
     * Author: Andy_P
    /*  Copyright 2012  andyswebdesign.ie  
    
        This program is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License, version 2, as
        published by the Free Software Foundation.
    
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
        along with this program; if not, write to the Free Software
        Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    */
    
    add_action( 'plugins_loaded', 'init_awd_shipping', 0 );
    
    function init_awd_shipping() {
    
    	if ( ! class_exists( 'WC_Shipping_Method' ) ) return;
    
    	class AWD_Shipping extends WC_Shipping_Method {
    
    		function __construct() {
    			$this->id           = 'awd_shipping';
    			$this->method_title = __( 'AWD Weight/Country', 'woocommerce' );
    
    			$this->admin_page_heading     = __( 'Weight and country based shipping', 'woocommerce' );
    			$this->admin_page_description = __( 'Define shipping by weight and country', 'woocommerce' );
    
    			add_action( 'woocommerce_update_options_shipping_' . $this->id, array( &$this, 'process_admin_options' ) );
    
    			$this->init();
    			$this->display_country_groups();
    		}
    
    		function init() {
    			$this->init_form_fields();
    			$this->init_settings();
    
    			$this->enabled          = $this->get_option('enabled');
    			$this->title            = $this->get_option('title');
                $this->availability     = 'specific';
    			$this->country_group_no	= $this->get_option('country_group_no');
                $this->countries 	    = $this->get_option('countries');
    			$this->type             = 'order';
    			$this->tax_status       = $this->get_option('tax_status');
    			$this->fee              = $this->get_option('fee');
    			$this->options			= isset( $this->settings['options'] ) ? $this->settings['options'] : '';
    			$this->options			= (array) explode( "\n", $this->options );
    
                if (empty($this->countries)) {
                    $this->availability = $this->settings['availability'] = 'all';
                }
    		}
    
    		function init_form_fields() {
    
                $woocommerce = function_exists('WC') ? WC() : $GLOBALS['woocommerce'];
    
    			$this->form_fields = array(
    				'enabled'    => array(
    					'title'   => __( 'Enable/Disable', 'woocommerce' ),
    					'type'    => 'checkbox',
    					'label'   => __( 'Enable this shipping method', 'woocommerce' ),
    					'default' => 'no',
    				),
    				'title'      => array(
    					'title'       => __( 'Method Title', 'woocommerce' ),
    					'type'        => 'text',
    					'description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce' ),
    					'default'     => __( 'Regular Shipping', 'woocommerce' ),
    				),
    				'tax_status' => array(
    					'title'       => __( 'Tax Status', 'woocommerce' ),
    					'type'        => 'select',
    					'description' => '',
    					'default'     => 'taxable',
    					'options'     => array(
    						'taxable' => __( 'Taxable', 'woocommerce' ),
    						'none'    => __( 'None', 'woocommerce' ),
    					),
    				),
    				'fee'        => array(
    					'title'       => __( 'Handling Fee', 'woocommerce' ),
    					'type'        => 'text',
    					'description' => __( 'Fee excluding tax, e.g. 3.50. Leave blank to disable.', 'woocommerce' ),
    					'default'     => '',
    				),
    				'options'       => array(
    					'title'       => __( 'Shipping Rates', 'woocommerce' ),
    					'type'        => 'textarea',
    					'description' => __( 'Set your weight based rates in ' . get_option( 'woocommerce_weight_unit' ) . ' for country groups (one per line). Example: <code>Max weight|Cost|country group number</code>. Example: <code>10|6.95|3</code>. For decimal, use a dot not a comma.', 'woocommerce' ),
    					'default'     => '',
    				),
    				'country_group_no' => array(
    					'title' 		=> __( 'Number of country groups', 'woocommerce' ),
    					'type' 			=> 'text',
    					'description'	=> __( 'Number of groups of countries sharing delivery rates (hit "Save changes" button after you have changed this setting).' ),
    					'default' 		=> '3',
    				),
    
    			);
    		}
    
        /*
        * Displays country group selects in shipping method's options
        */
        function display_country_groups() {
    
    		$woocommerce = function_exists('WC') ? WC() : $GLOBALS['woocommerce'];
    		$shippingCountries = method_exists($woocommerce->countries, 'get_shipping_countries')
                                        ? $woocommerce->countries->get_shipping_countries()
                                        : $woocommerce->countries->countries;
        //   echo prp($this->settings['countries1']);
            $number = $this->country_group_no;
            for($counter = 1; $number >= $counter; $counter++) {
    
                $this->form_fields['countries'.$counter] =  array(
                        'title'     => sprintf(__( 'Country Group %s', 'woocommerce' ), $counter),
                        'type'      => 'multiselect',
                        'class'     => 'chosen_select',
                        'css'       => 'width: 450px;',
                        'default'   => '',
                        'options'   => $shippingCountries
                );
            }
        }
    
    		function calculate_shipping( $package = array() ) {
    
    			global $woocommerce;
    
                $rates      = $this->get_rates_by_countrygroup($this->get_countrygroup($package));
                $weight     = $woocommerce->cart->cart_contents_weight;
                $final_rate = $this->pick_smallest_rate($rates, $weight);
    
                if($final_rate === false) return false;
    
                $taxable    = ($this->tax_status == 'taxable') ? true : false;
    
                if($this->fee > 0 && $package['destination']['country']) $final_rate = $final_rate + $this->fee;
    
                    $rate = array(
                    'id'        => $this->id,
                    'label'     => $this->title,
                    'cost'      => $final_rate,
                    'taxes'     => '',
                    'calc_tax'  => 'per_order'
                    );
    
            $this->add_rate( $rate );
        }
    
        /*
        * Retrieves the number of country group for country selected by user on checkout
        */
        function get_countrygroup($package = array()) {    
    
                $counter = 1;
    
                while(is_array($this->settings['countries'.$counter])) {
                    if (in_array($package['destination']['country'], $this->settings['countries'.$counter]))
                        $country_group = $counter;
    
                    $counter++;
                }
            return $country_group;
        }
    
        /*
        * Retrieves all rates available for selected country group
        */
        function get_rates_by_countrygroup($country_group = null) {
    
            $rates = array();
                    if ( sizeof( $this->options ) > 0) foreach ( $this->options as $option => $value ) {
    
                        $rate = preg_split( '~\s*\|\s*~', trim( $value ) );
    
                        if ( sizeof( $rate ) !== 3 )  {
                            continue;
                        } else {
                            $rates[] = $rate;
    
                        }
                    }
    
                    foreach($rates as $key) {
                        if($key[2] == $country_group) {
                            $countrygroup_rate[] = $key;
                        }
                    }
            return $countrygroup_rate;
        }
    
        /*
        * Picks the right rate from available rates based on cart weight
        */
        function pick_smallest_rate($rates,$weight) {
    
        if($weight == 0) return 0; // no shipping for cart without weight
    
            if( sizeof($rates) > 0) foreach($rates as $key => $value) {
    
                    if($weight <= $value[0]) {
                        $postage[] = $value[1];
                    }
                    $postage_all_rates[] = $value[1];
            }
    
            if(sizeof($postage) > 0) {
                return min($postage);
                    } else {
                    if (sizeof($postage_all_rates) > 0) return max($postage_all_rates);
                    }
            return false;
        }
    
    		public function admin_options() {
    			?>
    				<h3><?php _e( 'Weight and Country based Table Rates shipping', 'woocommerce' ); ?></h3>
    				<p><?php _e( 'Lets you calculate shipping based on country and weight of the cart. Lets you set unlimited weight bands on per country basis and group countries that share same delivery cost/bands.', 'woocommerce' ); ?></p>
    				<table class="form-table">
    					<?php $this->generate_settings_html(); ?>
    				</table>
    			<?php
    		}
    	}
    }
    
    function add_awd_shipping( $methods ) {
    	$methods[] = 'AWD_Shipping';
    	return $methods;
    }
    
    add_filter( 'woocommerce_shipping_methods', 'add_awd_shipping' );
    
    ?>
    dat98cbr

    (@dat98cbr)

    Very cool. Well done! Thanks man.

    naomidenbesten

    (@naomidenbesten)

    Thank you! It works great and solved the problem.

    creacoton

    (@creacoton)

    It works. Thanks !

    Hi, I’ve taken the AWD weight/country shipping code created by PozHonks and converted it into an official plugin; renamed from AWD-weightcountry-shipping to oik-weightcountry-shipping.

    It’s not yet on WordPress.org, but you can download it from http://oik-plugins.co.uk/oik-plugins/oik-weightcountry-shipping-woocommerce-extension/

    See the FAQs.
    http://oik-plugins.co.uk/oik-weightcountry-settings-faqs/

    The oik-weightcountry-shipping plugin is now available.

    https://wordpress.org/plugins/oik-weightcountry-shipping/

    Thanks to http://wordpress.org/support/profile/warren3i for pointing out the silly errors in version 1.0.3. Fixed in version 1.0.4

    Very good initiative !!!

Viewing 9 replies - 1 through 9 (of 9 total)
  • The topic ‘New plugin for testing for Woocommerce 2.1’ is closed to new replies.