Плагин пользовательского метода доставки WooCommerce, который возвращает стоимость доставки на основе нескольких критериев - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь создать плагин WooCommerce, который возвращает стоимость доставки для каждого продукта в корзине на основе следующих критериев:

  1. Почтовый индекс пункта назначения доставки
  2. Продукт SKU

Это то, что у меня пока есть: загружается и активируется, но не обеспечивает скорость доставки. Я получаю сообщение из корзины о том, что с найденной зоной стоимость доставки не связана.

 /**
 * Plugin Name: JxJ Shipping
 * Description: Custom Shipping Method for WooCommerce
 * Version: 1.0:
 * License: GPL-3.0+
 * License URI: http://www.gnu.org/licenses/gpl-3.0.html
 * Domain Path: /lang
 * Text Domain: jxj
 *
 * WC requires at least: 3.5
 * WC tested up to: 4.0
 *
 */

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

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

    function jxj_shipping_method_init() {

        if ( ! class_exists( 'WC_JxJ_Shipping_Method' ) ) {

        class WC_JxJ_Shipping_Method extends WC_Shipping_Method {

            /**
            * Constructor for your shipping class
            *
            * @access public
            * @return void
            */
            public function __construct() {
            $this->id = 'jxj_method';
            $this->method_title = __( 'JxJ Shipping Method' );
            $this->method_description = __( 'Custom Shipping Method for JuicedbyJ' );

            $this->init();

            $this->enabled = isset( $this->settings['enabled'] ) ? $this->settings['enabled'] : 'yes';
            $this->title = isset( $this->settings['title'] ) ? $this->settings['title'] : __( 'jxj Shipping', 'jxj' );  
        }

        /**
         * Init your settings
         *
         * @access public
         * @return void
         */
        function init() {
            $this->init_form_fields();
            $this->init_settings();

            add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
        }

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

            $this->form_fields = array(

                'enabled' => array(
                    'title' => __( 'Enable', 'jxj' ),
                    'type' => 'checkbox',
                    'description' => __( 'Enable this shipping.', 'jxj' ),
                    'default' => 'yes',
                    'class'=> 'WC_JxJ_Shipping_Method'
                   ),

                'title' => array(
                    'title' => __( 'Title', 'jxj' ),
                      'type' => 'text',
                      'description' => __( 'Title to be display on site', 'jxj' ),
                      'default' => __( 'jxj Shipping', 'jxj' ),
                      'class'=> 'WC_JxJ_Shipping_Method'
                     ),

                'packaging' => array(

                    'title' => array(

                        'title'=>__( '6 Pack (120z)', 'jxj' ),
                        'type' => 'checkbox',
                        'description' => __( 'Juice sold in package of 6 (12oz plastic bottles)', 'jxj' ),
                        'default' => 'yes',
                        'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    'title' => array(
                      'title' => __( '24 Case (120z)', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Juice sold in case of 24 (12oz plastic bottles)', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),  

                    'title' => array(
                      'title' => __( '3 Pack (750ml)', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Juice sold in package of 3 (750ml glass bottles)', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    'title' => array(
                      'title' => __( '12 Case (750ml)', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Juice sold in case of 12 (750ml glass bottles)', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                ),


                'weight' => array(
                    'title' => __( 'Weight (oz)', 'jxj' ),
                    'type' => 'number',
                    'description' => __( 'Maximum allowed weight', 'jxj' ),
                    'default' => 350,
                    'class'=> 'WC_JxJ_Shipping_Method'
                ),

                /**Available regions*/
                'regions' => array(

                    array(
                      'title' => __( 'Bangor', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Bangor, ME rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    array(
                      'title' => __( 'Hartford', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Hartford, CT rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    array(
                      'title' => __( 'Burlington', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Burlington, VT rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    array(
                      'title' => __( 'Atlanta', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Atlanta, GA rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    array(
                    'title' => __( 'Miami', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Miami, FL rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),  

                    array(
                      'title' => __( 'Jackson', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Jackson, MS rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    array(
                      'title' => __( 'Louisville', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Louisville, KY rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),  

                    array(
                      'title' => __( 'Cleveland', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Cleveland, OH rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),  

                    array(
                      'title' => __( 'Des Moines', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Des Moines, IA rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                     ),  

                    array(
                      'title' => __( 'Madison', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Madison, WI rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    array(
                      'title' => __( 'Minneapolis', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Minneapolis, MN rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    array(
                      'title' => __( 'Chicago', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Chicago, IL rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    array(
                      'title' => __( 'New Orleans', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of New Orleans, LA rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                    array(
                      'title' => __( 'Little Rock', 'jxj' ),
                      'type' => 'checkbox',
                      'description' => __( 'Region of Little Rock, AR rates', 'jxj' ),
                      'default' => 'yes',
                      'class'=> 'WC_JxJ_Shipping_Method'
                    ),

                ),

            );

        }


        /**
         * calculate_shipping function.
         *
         * @access public
         * @param mixed $package
         * @return void
         */
        public function calculate_shipping( $package ) {

            $packKey = '';
            $cost = 0;
            $zone = "";                         

            foreach ( $package['contents'] as $item_id => $values )
            {   

                $_product = $values['data'];
                $price = $_product->get_price();
                $packaging = $_product->get_sku();
                $strPack = strval($packaging);
                $strSize = strlen($packaging);
                if ( $strSize == 9 ) {
                    return $packKey = substr($strPack, $strSize-1, 1);
                } else {
                    return $packKey = substr($strPack, $strSize-2, 2);
                }

                $weight = $_product->get_weight();
                $str_weight = strval($weight);

                $zipcode = $package [ "destination" ][ "postcode" ];
                $str_zip = strval($zipcode);
                $subtotal = WC()->cart->get_cart_totals();

                $shipZones = array (
                        "Bangor"=>array('04401','04402'),
                        "Burlington"=>array('05401','05402'),
                        "Hartford"=>array('06101','06012'),
                        "Atlanta"=>array('30301','30302'),
                        "Miami"=>array('33114','33109'),
                        "Jackson"=>array('39056','39174'),
                        "Loiusville"=>array('40018','40023'),
                        "Cleveland"=>array('44101','44103'),
                        "Des Moines"=>array('50211','50047'),
                        "Madison"=>array('53558','53562'),
                        "Minneapolis"=>array('55111','55401'),
                        "Chicago"=>array('60106','60131'),
                        "New Orleans"=>array('70032','70043'),
                        "Little Rock"=>array('72002','72103'),
                );

                /**
                /*array("zone"=>'pack'=>cost)
                */

                $zonePrices = array (
                      "Bangor"=>array('3'=>18.37,'12'=>46.54,'6'=>14.64,'24'=>29.08),
                      "Burlington"=>array('3'=>11.54,'12'=>26.62,'6'=>10.35,'24'=>15.46),
                      "Hartford"=>array('3'=>12.32,'12'=>30.57,'6'=>11.10,'24'=>17.57),
                      "Atlanta"=>array('3'=>18.37,'12'=>46.54,'6'=>14.64,'24'=>29.08),
                      "Miami"=>array('3'=>20.64,'12'=>58.16,'6'=>16.64,'24'=>37.74),
                      "Jackson"=>array('3'=>20.62,'12'=>58.16,'6'=>16.64,'24'=>37.74),
                      "Louisville"=>array('3'=>18.37,'12'=>46.54,'6'=>14.64,'24'=>29.08),
                      "Cleveland"=>array('3'=>13.69,'12'=>36.92,'6'=>12.04,'24'=>20.70),
                      "Des Moines"=>array('3'=>18.37,'12'=>46.54,'6'=>14.64,'24'=>29.08),
                      "Madison"=>array('3'=>18.37,'12'=>45.54,'6'=>14.64,'24'=>29.08),
                      "Minneapolis"=>array('3'=>18.37,'12'=>46.54,'6'=>14.64,'24'=>29.08),
                      "Chicago"=>array('3'=>18.37,'12'=>46.54,'6'=>14.64,'24'=>29.08),
                      "New Orleans"=>array('3'=>20.62,'12'=>58.16,'6'=>16.64,'24'=>37.74),
                      "Little Rock"=>array('3'=>20.62,'12'=>58.16,'6'=>16.64,'24'=>37.74)
                );

                $searchArray1 = [];
                $searchArray2 = [];
                $shipRate = 0;
                $region = '';
                $regionRef = '';

                foreach ( $shipZones as $key => $value ) {
                    $searchArray1 = $value;
                    $regionRef = $key;

                    //find zipcode in value array
                    foreach (  $searchArray1 as $key => $value ) {

                        if ( $zipcode == $value ) {

                            $region = $regionRef;

                            foreach ( $zonePrices as $key => $value ) {
                                $searchArray2 = $value;
                                if ( $region == $key ) {
                                    foreach ( $searchArray2 as $key => $value) {
                                        if ( $packKey == $key ) {
                                            $shipRate = round($value,2);
                                            return $shipRate = sprintf('%.2f',$value);
                                        }
                                    }
                                }
                            }

                        } else {
                            return $shipRate = $price * 0.2;
                        } 

                    }

                }

                $rate = array(
                    'id' => $this->id,
                    'label' => $this->title,
                    'cost' => $shipRate,
                    'calc_tax' => 'per_item'
                );


                $this->add_rate( $rate );

            }

        }

    }

}

}

add_action( 'woocommerce_shipping_init', 'jxj_shipping_method_init' );

function add_jxj_shipping_method( $methods ) {
$methods['jxj_shipping_method'] = 'WC_JxJ_Shipping_Method';
return $methods;
}

add_filter( 'woocommerce_shipping_methods', 'add_jxj_shipping_method' );


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...