我使用下面的代码(由 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' );
我遇到了同样的问题,我的解决方案是创建一个从 WC_Shipping_Method 扩展的新类,并在那里保留所有相同的代码,并且我创建了 3 个扩展新类的新类,任何一个都有自己的 ID 和方法类型
这不是最好的解决方案,但它比重复 N 次相同的类代码更优雅
好的,我已经通过重命名类名成功添加了另一种运输方法。以前我可能做错了什么
但是我想知道是否有更好的方法来做到这一点,因为我已经复制粘贴了整个代码块两次,我的背景不是面向对象的,但我认为这不是做这件事的正确方法
您可以创建 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();
}