You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:10:38