Woocommerce 添加多种运输方式

问题描述 投票:0回答:3

我使用下面的代码(由 woocommerce API 提供)来添加自定义送货方法,它正在工作,但现在我想添加另一种送货方法,我尝试复制粘贴具有不同类名的相同代码,但第二个实际上不起作用方法正在替换第一个方法

我想知道如何创建另一种运输方式? 谢谢你

    function your_shipping_method_init() {
    if ( ! class_exists( 'WC_Your_Shipping_Method' ) ) {
        class WC_Your_Shipping_Method extends WC_Shipping_Method {
            /**
             * Constructor for your shipping class
             *
             * @access public
             * @return void
             */
            public function __construct() {
                $this->id                 = 'vip_rate'; // Id for your shipping method. Should be uunique.
                $this->method_title       = __( 'VIP Shipping Rate' );  // Title shown in admin
                $this->method_description = __( '$35 flate rate' ); // Description shown in admin

                $this->enabled            = "yes"; // This can be added as an setting but for this example its forced enabled
                $this->title              = "VIP Shipping rate"; // This can be added as an setting but for this example its forced.

                $this->init();
            }

            /**
             * Init your settings
             *
             * @access public
             * @return void
             */
            function init() {
                // Load the settings API
                $this->init_form_fields(); // This is part of the settings API. Override the method to add your own settings
                $this->init_settings(); // This is part of the settings API. Loads settings you previously init.

                // Save settings in admin if you have any defined
                add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
            }

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


                $cost=35; 

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

                // Register the rate
                $this->add_rate( $rate );
            }
        }
    }
}

add_action( 'woocommerce_shipping_init', 'your_shipping_method_init' );

function add_your_shipping_method( $methods ) {
    $methods[] = 'WC_Your_Shipping_Method';
    return $methods;
}

add_filter( 'woocommerce_shipping_methods', 'add_your_shipping_method' );
wordpress woocommerce
3个回答
2
投票

我遇到了同样的问题,我的解决方案是创建一个从 WC_Shipping_Method 扩展的新类,并在那里保留所有相同的代码,并且我创建了 3 个扩展新类的新类,任何一个都有自己的 ID 和方法类型

这不是最好的解决方案,但它比重复 N 次相同的类代码更优雅


1
投票

好的,我已经通过重命名类名成功添加了另一种运输方法。以前我可能做错了什么

但是我想知道是否有更好的方法来做到这一点,因为我已经复制粘贴了整个代码块两次,我的背景不是面向对象的,但我认为这不是做这件事的正确方法


0
投票

您可以创建 Shipping 方法类的多个实例,并将该实例传递到 woocommerce_shipping_methods 过滤器上

这就是我所做的:

add_filter( 'woocommerce_shipping_methods', 'add_your_shipping_method' );
function add_your_shipping_method( $methods ) {
   $instanceA = new MyMethodClass("unique-method-name-1", 'method-title-1', 'method-description-1');
   $instanceB = new MyMethodClass("unique-method-name-2", 'method-title-2', 'method-description-2');
   $methods['unique-method-name-1'] = $instanceA;
   $methods['unique-method-name-2'] = $instanceB;
   return $methods;
}

然后在自定义类上将接受来自构造函数的名称标题和描述:

function __construct($name, $title, $description) {
    $this->id = $name; // Id for your shipping method. Should be uunique.
    $this->method_title       = __( $title );  
    $this->method_description = __( $description );
    $this->enabled            = "yes"; 
    $this->title              = $title; 
    $this->init();
}
© www.soinside.com 2019 - 2024. All rights reserved.