修复Woocommerce自定义Shipping Zone Method的设置与生效问题
修复WooCommerce自定义按预订天数计算运费的配送方式问题
问题背景
在WC 7.2.2、WP 6.0.3环境下,基于WooCommerce Easy Booking开发自定义配送方式,需求是按预订天数计算运费。现有代码存在两个问题:
- 后台无法显示该配送方式的设置选项(标题、单日运费)
- 指定配送区域内的邮编无法识别该配送方式
修复后的完整代码
<?php if (!defined('ABSPATH')) { exit; // Exit if accessed directly } function your_shipping_method_init() { if (!class_exists('WC_Diet_Day_Shipping')) { class WC_Diet_Day_Shipping extends WC_Shipping_Method { /** * Constructor for your shipping class */ public function __construct($instance_id = 0) { parent::__construct($instance_id); $this->id = 'diet_day_shipping'; // 唯一ID $this->method_title = __('按预订天数计费配送'); // 后台显示的标题 $this->method_description = __('根据用户预订的天数计算运费'); // 后台描述 $this->supports = array( 'shipping-zones', 'instance-settings', 'instance-settings-modal', ); // 定义实例设置字段 $this->instance_form_fields = array( 'title' => array( 'title' => __('前台显示标题'), 'type' => 'text', 'description' => __('用户在结账时看到的配送方式名称'), 'default' => __('每日配送(按预订天数计费)'), 'desc_tip' => true, ), 'cost' => array( 'title' => __('单日运费'), 'type' => 'number', 'description' => __('每预订一天的运费金额'), 'default' => 7, 'desc_tip' => true, 'custom_attributes' => array( 'min' => '0', 'step' => '0.01' ) ) ); $this->init(); } /** * 初始化设置 */ public function init() { // 加载保存的设置 $this->title = $this->get_option('title'); $this->cost = $this->get_option('cost'); // 初始化实例设置,确保后台界面正常渲染 $this->instance_settings = $this->get_instance_settings(); } /** * 计算运费 * @param array $package */ public function calculate_shipping($package = array()) { $total_cost = 0; // 遍历购物车商品,计算总运费 foreach ($package['contents'] as $item_id => $values) { $_product = $values['data']; // 检查产品是否支持Easy Booking if (method_exists($_product, 'wceb_get_product_booking_duration')) { $booking_days = $_product->wceb_get_product_booking_duration(); $total_cost += $booking_days * $values['quantity'] * $this->cost; } } // 如果没有计算出运费,使用默认单日运费(可选逻辑) if ($total_cost <= 0) { $total_cost = $this->cost; } // 添加运费选项 $this->add_rate(array( 'id' => $this->id . $this->instance_id, 'label' => $this->title, 'cost' => $total_cost, )); } } } } add_action('woocommerce_shipping_init', 'your_shipping_method_init'); function add_diet_day_shipping_method($methods) { $methods['diet_day_shipping'] = 'WC_Diet_Day_Shipping'; return $methods; } add_filter('woocommerce_shipping_methods', 'add_diet_day_shipping_method');
关键修复点说明
构造函数优化:
- 调用父类构造函数,确保WooCommerce配送方法的基础逻辑正确初始化
- 移除重复的
init_form_fields方法,统一使用instance_form_fields(适配支持instance-settings的配送方式) - 去掉重复的设置更新钩子注册,父类
WC_Shipping_Method已内置该逻辑
设置加载逻辑修正:
- 将获取
title和cost选项的逻辑移到init()方法中,确保设置从数据库正确加载 - 初始化
instance_settings,保证后台设置界面正常渲染
- 将获取
配送识别与运费计算修复:
- 运费计算中使用实例设置的
title和cost,替代硬编码内容 - 添加对Easy Booking方法的存在性检查,避免产品不支持时出现报错
- 正确遍历购物车商品计算总运费,贴合按预订天数计费的需求
- 运费计算中使用实例设置的
类名规范调整:将类名改为
WC_Diet_Day_Shipping,语义更清晰,避免通用命名引发冲突
内容的提问来源于stack exchange,提问作者NoAd
相关产品推荐
相关产品推荐

