如何根据商品配送类别修改WooCommerce结账页配送方式标题?
修复WooCommerce根据配送类别修改配送方式标题的代码问题
你的代码未生效主要有两个核心问题:
- 赋值语句覆盖逻辑:if-else块之后直接写了两行
$rates[$rate_key]->label赋值,不管前面的判断结果,最终所有flat_rate的标题都会被改成standard Shipping,完全覆盖了之前的条件判断。 - 逻辑单一,无法区分多配送类别:当前代码只针对单个配送类别ID(64),没法实现你需要的3-day shipping、freight、standard shipping三类不同的标题切换需求。
修复后的代码
下面是适配你需求的完整代码,支持根据不同配送类别切换对应配送方式的标题:
add_filter('woocommerce_package_rates', 'change_shipping_method_name_based_on_shipping_class', 50, 2); function change_shipping_method_name_based_on_shipping_class($rates, $package){ // 定义配送类别ID与对应标题的映射 // 替换成你店铺实际的配送类别ID和标题 $shipping_class_map = [ 64 => 'Standard Shipping', // 对应standard shipping类别 65 => '3-Day Shipping', // 对应3-day shipping类别 66 => 'Freight' // 对应freight类别 ]; $matched_class_id = false; // 遍历购物车商品,匹配对应的配送类别 // 注:如果购物车有多个不同配送类别的商品,这里取第一个匹配的类别 // 可根据需求调整逻辑,比如优先某个类别或提示多类别冲突 foreach( $package['contents'] as $cart_item ) { $item_class_id = $cart_item['data']->get_shipping_class_id(); if( isset($shipping_class_map[$item_class_id]) ){ $matched_class_id = $item_class_id; break; } } // 根据匹配到的类别修改配送方式标题 foreach ( $rates as $rate_key => $rate ) { // 针对Flat Rate配送方式修改标题 if ( 'flat_rate' === $rate->method_id ) { if( $matched_class_id ){ $rates[$rate_key]->label = __( $shipping_class_map[$matched_class_id], 'woocommerce' ); } else { // 没有匹配到自定义类别时使用默认标题 $rates[$rate_key]->label = __( 'Default Shipping', 'woocommerce' ); } } // 如果Freight是单独的配送方式(比如method_id为'freight_shipping'),单独处理 if ( 'freight_shipping' === $rate->method_id ) { $rates[$rate_key]->label = __( 'Freight', 'woocommerce' ); } } return $rates; }
关键说明
- 配送类别ID替换:把
$shipping_class_map里的ID替换成你店铺实际的配送类别ID,可在WooCommerce后台「产品 > 配送类别」中查看每个类别的ID。 - 多商品逻辑调整:如果购物车存在多个不同配送类别的商品,当前代码会取第一个匹配的类别,可根据业务需求修改这部分逻辑(比如禁止混合类别、显示合并标题等)。
- 配送方式method_id:如果你的Freight是单独的配送插件(而非Flat Rate下的类别),需要替换对应的
method_id,可开启WooCommerce调试模式查看具体值。 - 清除缓存:修改代码后,进入WooCommerce后台「设置 > 配送 > 配送选项」,点击「更新」按钮清空配送缓存,否则修改可能不会立即生效。
内容的提问来源于stack exchange,提问作者xrm44
相关产品推荐
相关产品推荐

