在 WooCommerce 项目中,当店铺商品使用了不同的运费分类(shipping class)时,默认的配送方式标签往往只是固定的“平邮”“快递”等文字,顾客在结算页无法感知当前订单具体适用了哪一类运费规则。通过动态调整配送方式的完整标签,可以把商品运费分类信息直接带入标签中,提升结算透明度。

理解 WooCommerce 配送标签的生成机制
WooCommerce 在前端购物车和结算页展示配送方式时,会调用 woocommerce_cart_shipping_method_full_label 这个过滤钩子。它的作用是把单一的配送方式名称(比如“ flat_rate ”)和对应的费用组合成用户看到的“完整标签”。如果不做任何处理,标签就是“配送名:¥费用”这种固定结构。
当我们希望根据商品运费分类来修改标签,就需要在钩子回调里拿到两个关键对象:当前的 WC_Shipping_Rate 实例,以及代表包裹的 WC_Package 或购物车内容。运费分类本身是挂在商品上的 term,我们可以通过遍历购物车商品来获取它们所属的 shipping_class 标识,再决定标签前缀或后缀显示什么。
获取购物车商品的运费分类
在改写标签之前,首先要能准确拿到当前订单里所有商品的运费分类。WooCommerce 中每个商品产品对象都有 get_shipping_class() 方法,返回的是分类的 slug。如果是变体商品,则需要从父产品取分类。
下面这段代码演示了如何从购物车中提取所有不重复的运费分类 slug,并统计数量,方便后续判断应该以哪个分类为主来生成标签:
function get_cart_shipping_classes() {
$classes = array();
foreach ( WC()->cart->get_cart() as $item ) {
$product = $item['data'];
$class = $product->get_shipping_class();
if ( $class ) {
if ( ! isset( $classes[$class] ) ) {
$classes[$class] = 0;
}
$classes[$class] += $item['quantity'];
}
}
return $classes;
}
上面的函数返回一个以分类 slug 为键、数量为值的数组。如果数组为空,说明购物车商品都没有设置运费分类,此时应保持原标签不变,避免显示无意义文字。
使用钩子动态修改完整标签
有了分类数据后,就可以挂载到 woocommerce_cart_shipping_method_full_label 钩子上。该钩子接收两个参数:第一个是默认生成的标签 HTML 字符串,第二个是 WC_Shipping_Rate 对象。我们可以在标签前面或后面追加分类说明。
下面的示例根据购物车中数量最多的运费分类,在标签前加上“【大件】”或“【易碎】”这类中文前缀。注意这里仅做文本拼接,不破坏原有费用显示:
add_filter( 'woocommerce_cart_shipping_method_full_label', 'modify_shipping_label_by_class', 10, 2 );
function modify_shipping_label_by_class( $label, $method ) {
$classes = get_cart_shipping_classes();
if ( empty( $classes ) ) {
return $label;
}
// 找出数量最多的分类
$top_class = array_keys( $classes, max( $classes ) );
$top_class = $top_class[0];
$map = array(
'large' => '大件',
'fragile'=> '易碎',
'free' => '免运费',
);
$prefix = isset( $map[ $top_class ] ) ? '【' . $map[ $top_class ] . '】' : '';
return $prefix . $label;
}
这种写法的优点是逻辑简单、对原有标签结构零破坏;缺点是当购物车混合了多个差异很大的分类时,只显示最多的那一个,可能让部分顾客疑惑。若业务要求更严谨,可以在标签后用小字列出所有分类,但需注意前端样式不要被拉长太多。
与费率计算保持一致性
只改前端标签还不够,如果后台通过 woocommerce_package_rates 钩子按运费分类动态调整了费率,那么标签中的分类描述必须和费率逻辑对应。例如费率钩子里对“ large ”分类加了附加费,标签里就必须出现“大件”字样,否则顾客看到费用增加却找不到原因。
推荐的做法是把分类与文案的映射关系写成一个公共函数,费率钩子和标签钩子都调用它,这样后续增删分类只需改一处。同时,在 woocommerce_package_rates 中如果因为某分类而 unset 了某些配送方式,标签钩子里也要做好空值判断,防止报错。
注意事项与常见误区
不少开发者会直接在主题模板里硬编码标签,这种做法在 WooCommerce 更新后极易失效,因为模板结构可能变化。正确方式永远是用过滤钩子,把逻辑放在子主题的 functions.php 或自定义插件中。
另一个误区是忽略多语言场景。如果站点用了 WPML 等翻译插件,分类映射里的“大件”等中文应走翻译函数,否则切换英文后前台会出现中英混杂。使用 __() 包裹静态文案即可解决。最后,修改标签时不要移除 $method->get_label() 原有的可访问性结构,保证屏幕阅读器仍能正常识别配送方式与价格。
WooCommerce运费分类配送标签修改时间:2026-08-03 10:30:29