woocommerce third party shipping methods

Viewed 453

I have created woocommerce plugin which gets shipping rates from third party URL(my web site) and displays it on the checkout page. when I click on one of shipping method it also calculates correct shipping rates, but when I again refresh checkout page my selected shipping option gets lost and I have to select again. also, my custom shipping option does not reach to order after a successful order.

In below Screenshot, I pass Suburb and Postcode, and I get all rates i desire, when i click on one of shipping method it also calculates correct a shipping rates

enter image description here

After Click on Place Order, it takes first shipping method which is a flat rate: $5, please see below screenshot enter image description here

Here is my Plugin please have a look and guide me where I am going wrong.

<?php
/**
 * Plugin Name: Iconsignit Shipping
 * Plugin URI: http://Iconsignit.com.au
 * Description: Iconsignit Shipping Method for WooCommerce
 * Version: 1.0.0
 * Author: Jaimin prajapati
 * Author URI: http://www.webbrainstechnologies.com
 * License: GPL-3.0+
 * License URI: http://www.gnu.org/licenses/gpl-3.0.html
 * Domain Path: /
 * Text Domain: Iconsignit
 */

if (!defined('WPINC')) {
    die;
}

/*
 * Check if WooCommerce is active
 */
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {

    function iconsignit_shipping_method()
    {
        if (!class_exists('Iconsignit_Shipping_Method')) {
            class Iconsignit_Shipping_Method extends WC_Shipping_Method
            {
                /**
                 * Constructor for your shipping class
                 *
                 * @access public
                 * @return void
                 */
                public function __construct($instance_id = 0)
                {
                    $this->id = 'iconsignit';
                    $this->instance_id = absint($instance_id);
                    $this->method_title = __('Iconsignit Shipping', 'iconsignit');
                    $this->method_description = __('Custom Shipping Method for iconsignit', 'iconsignit');
                    $this->init();
                    $this->enabled = isset($this->settings['enabled']) ? $this->settings['enabled'] : 'yes';
                    $this->title = isset($this->settings['title']) ? $this->settings['title'] : __('Iconsignit Shipping', 'iconsignit');
                }

                /**
                 * Init your settings
                 *
                 * @access public
                 * @return void
                 */
                function init()
                {
                    // Load the settings API
                    $this->init_form_fields();
                    $this->init_settings();
                    // Save settings in admin if you have any defined
                    add_action('woocommerce_update_options_shipping_' . $this->id, array($this, 'process_admin_options'));
                }

                /**
                 * Define settings field for this shipping
                 * @return void
                 */
                function init_form_fields()
                {

                    // We will add our settings here
                    $this->form_fields = array(
                        'ApiToken' => array(
                            'title' => __('Api Token', 'iconsignit-integration-demo'),
                            'type' => 'text',
                            'description' => __('Enter with your API Key. You can find this in "User Profile" drop-down (top right corner) > API Keys.', 'iconsignit-integration-demo'),
                            'desc_tip' => true,
                            'default' => '',
                        ),
                        'ApiUrl' => array(
                            'title' => __('Api Url', 'iconsignit-integration-demo'),
                            'type' => 'text',
                            'default' => '',
                            'desc_tip' => true,
                            'description' => __('Website URL', 'iconsignit-integration-demo'),
                        ),
                        'ConnectIconsignUrl' => array(
                            'title' => __('Iconsignit Url', 'iconsignit-integration-demo'),
                            'type' => 'text',
                            'default' => '',
                            'desc_tip' => true,
                            'description' => __('Url from where all shipping rates will come', 'iconsignit-integration-demo'),
                        ),
                        
                    );

                }

                /**
                 * This function is used to calculate the shipping cost. Within this function we can check for weights, dimensions and other parameters.
                 *
                 * @access public
                 * @param mixed $package
                 * @return void
                 */
                public function calculate_shipping($package = array())
                {

                    // We will add the cost, rate and logics in here
                    $item = array();
                    $count = 0;
                    foreach ($package['contents'] as $item_id => $values) {
                        $item[$count]['item_qty'] = $values['quantity'];
                        $item[$count]['item_length'] = $values['data']->get_length();
                        $item[$count]['item_width'] = $values['data']->get_width();
                        $item[$count]['item_height'] = $values['data']->get_height();
                        $item[$count]['item_weight'] = $values['data']->get_weight();
                        $item[$count]['item_palletised'] = 0;
                        $count++;
                    }
                    $country = $_POST['s_country'];
                    $state = $_POST['s_state'];
                    $postcode = $_POST['s_postcode'];
                    $city = $_POST['s_city'];
                    $address = $_POST['s_address'];
                    $address_2 = $_POST['s_address_2'];
                    $isCredentials = get_option('woocommerce_iconsignit_settings');
                    $data = array('ApiUrl' => $isCredentials['ApiUrl'], 'ApiToken' => $isCredentials['ApiToken'], 'DeliveryTown' => $city, 'DeliveryPostcode' => $postcode, 'Items' => $item);
                    $isResponse = Requests::post($isCredentials['ConnectIconsignUrl'].'/api/getconsignrate', array(), $data);

                    $resp = json_decode($isResponse->body, true);
                    $counter = 1;
                    foreach ($resp['result'] as $key => $res) {
                        $rate = array(
                            'id' => $res['QuoteRateID'],//$this->id,
                            'label' => $res['carrier_nm'] . "-(" . $res['service_nm'] . ")",
                            'cost' => $res['total_charge'],
                            'calc_tax' => 'per_item',
                        );
                        $this->add_rate($rate);
                        $counter++;
                    }
                }
            }
        }
    }

    add_action('woocommerce_shipping_init', 'iconsignit_shipping_method');

    function add_iconsignit_shipping_method($methods)
    {
        $methods[] = 'Iconsignit_Shipping_Method';
        return $methods;
    }

    add_filter('woocommerce_shipping_methods', 'add_iconsignit_shipping_method');
    

    
}
1 Answers

problem is solved the problem was in $this->id, it should have to be unique.

Related