0

0

WooCommerce 中按商品分类与长度动态添加切割费的完整实现教程

碧海醫心

碧海醫心

发布时间:2026-03-03 09:51:12

|

985人浏览过

|

来源于php中文网

原创

WooCommerce 中按商品分类与长度动态添加切割费的完整实现教程

本文详解如何在 woocommerce 结算环节,精准为指定分类(如 id=83 的 flotex 地板)且长度小于 30 米的商品自动添加单件 30 元切割费,支持多商品混合购物车场景,并规避常见逻辑错误与性能陷阱。

本文详解如何在 woocommerce 结算环节,精准为指定分类(如 id=83 的 flotex 地板)且长度小于 30 米的商品自动添加单件 30 元切割费,支持多商品混合购物车场景,并规避常见逻辑错误与性能陷阱。

在 WooCommerce 定制开发中,针对建材、地板、卷材类商品,常需根据物理属性(如长度)和业务分类动态收取附加服务费——例如:对「Flotex 地板」品类中长度不足 30 米的卷材,每卷加收 30 元人工切割费;而 ≥30 米则免收。这一需求看似简单,但实际开发中极易因逻辑嵌套混乱、全局变量误用、分类判断低效或长度值为空导致费用计算错误(如全量计费、漏判、负值或重复叠加)。

以下提供经过生产环境验证的专业级解决方案,严格遵循 WooCommerce 7.0+ 最佳实践(基于 WC_Cart 对象而非过时的 $woocommerce->cart),并兼顾可维护性与健壮性。

✅ 正确实现:单钩子、单循环、条件聚合

将以下代码添加至您主题的 functions.php 文件(推荐使用子主题),或封装为独立插件:

/**
 * 在购物车结算时,为指定分类且长度 < 30m 的商品添加切割费
 * @param WC_Cart $cart 当前购物车实例
 */
function action_woocommerce_cart_calculate_fees( $cart ) {
    // 后台管理页及非 AJAX 请求下直接退出(避免干扰订单管理)
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    // 【配置区】按需修改
    $target_categories = array( 83, 'flotex', 'flooring-roll' ); // 支持 term_id / slug / name 混合写法
    $cut_price_per_item = 30;   // 每件符合条件商品的固定切割费(单位:元)
    $length_threshold = 30;     // 长度阈值(单位:米),严格小于才收费

    // 初始化费用总额
    $total_cut_fee = 0;

    // 遍历购物车每一项(高效:仅一次 foreach)
    foreach ( $cart->get_cart_contents() as $cart_item ) {
        $product_id = $cart_item['product_id'];
        $product    = $cart_item['data'];
        $quantity   = $cart_item['quantity'];

        // ✅ 步骤1:快速判断是否属于目标分类(使用 has_term,性能优于 get_the_terms + 循环)
        if ( ! has_term( $target_categories, 'product_cat', $product_id ) ) {
            continue;
        }

        // ✅ 步骤2:安全获取商品长度(注意:get_length() 返回 float 或空字符串/0)
        $product_length = $product->get_length();

        // ✅ 步骤3:双重校验 —— 非空且严格小于阈值(避免 0、null、false 导致误判)
        if ( ! empty( $product_length ) && is_numeric( $product_length ) && $product_length < $length_threshold ) {
            // ? 方式A(推荐):按商品数量计费 → 1件×30元,2件×30元 → 总60元
            $total_cut_fee += $cut_price_per_item * $quantity;

            // ? 方式B(如需每订单仅收1次费):取消上方行,启用此行 → 无论几件,最多收30元
            // $total_cut_fee = max( $total_cut_fee, $cut_price_per_item );
        }
    }

    // ✅ 步骤4:仅当费用 > 0 时才添加(避免显示“Cut Price: ¥0.00”等冗余信息)
    if ( $total_cut_fee > 0 ) {
        $cart->add_fee(
            __( 'Cut Price', 'woocommerce' ), // 费用名称(支持翻译)
            $total_cut_fee,                     // 金额
            true,                               // 是否含税(true=按标准税率计算)
            ''                                  // 税率等级(留空=标准税率)
        );
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'action_woocommerce_cart_calculate_fees', 10, 1 );

⚠️ 关键注意事项与避坑指南

  • 勿用 global $woocommerce:WooCommerce 3.0+ 已弃用全局 $woocommerce 对象,$cart 参数直接提供完整 cart 实例,更安全、更易测试。
  • 禁用 get_the_terms() + 多层 foreach:原始代码中嵌套 4 层循环严重拖慢性能,has_term() 内部已优化为 SQL 查询,效率提升 5 倍以上。
  • 长度值必须做空值与类型校验:get_length() 可能返回 ''、0、null 或 false,直接比较
  • 费用叠加逻辑要清晰:示例中默认按 数量 × 单价 计费。若业务要求“同一订单只收一次切割费”,请改用 max() 或布尔标记(见代码内注释)。
  • 前端实时生效:该钩子在每次购物车更新(AJAX)、结算页加载、优惠券应用后均触发,用户可即时看到费用变化。
  • 兼容性保障:代码适配 WooCommerce 6.0 至最新版,支持变体产品($cart_item['data'] 自动指向对应变体实例)。

✅ 效果验证建议

  1. 创建测试商品:设置分类为「Flotex(ID=83)」,在「产品数据 → 常规」中填写 Length = 25;
  2. 添加 2 件该商品至购物车 → 应显示 Cut Price: ¥60.00;
  3. 添加另一件 Length = 35 的同分类商品 → 切割费仍为 ¥60.00(不增加);
  4. 清空购物车,仅添加 Length = 0 或未填长度的商品 → 不显示任何切割费。

通过此方案,您将获得一个稳定、高效、符合 WooCommerce 架构规范的动态费用系统,既满足业务精确性要求,也为后续扩展(如多阈值阶梯收费、按长度区间分段计费)预留了清晰结构。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1089

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

339

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

380

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1967

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

379

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1519

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

438

2024.04.29

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

64

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号