Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
WooCommerce 购物车中多产品同类附加费的精确累加教程_创想鸟

WooCommerce 购物车中多产品同类附加费的精确累加教程

WooCommerce 购物车中多产品同类附加费的精确累加教程

本教程详细指导如何在 WooCommerce 购物车中实现对属于同一附加费类别的多个产品进行费用累加。针对现有代码中费用无法正确汇总的问题,本文将展示如何通过优化产品ID配置为数组,并结合购物车商品数量,精确计算并应用各项附加费用,确保费用逻辑的准确性和灵活性。

1. 问题背景与现有挑战

在 woocommerce 商店中,为特定产品或产品组添加额外费用是常见的需求,例如服务费、包装费等。然而,当这些费用被设计为应用于一组产品(例如,属于同一类别的多个产品)时,如果购物车中包含多个来自该组的产品,现有的实现可能只会对该类别的费用计算一次,而不是根据购物车中此类产品的数量进行累加。这导致了费用计算的不准确,影响了商家的营收和用户的支付体验。

问题的核心在于对产品ID的错误处理以及缺乏对购物车中同类产品数量的累加机制。例如,将多个产品ID错误地作为 __() 翻译函数的参数传入,而不是作为数组来表示一个产品集合。

2. 解决方案核心思路

解决此问题的关键在于以下几点:

正确配置产品ID: 将属于同一费用类别的所有产品ID以数组的形式进行定义,而不是使用 __() 翻译函数。__() 函数用于字符串翻译,与产品ID的集合无关。引入累加器: 在每个费用设置中引入一个 total_amount 字段,用于在遍历购物车时累加属于该费用类别的总金额。考虑商品数量: 在计算累加金额时,不仅要考虑产品ID是否匹配,还要将购物车中商品的数量纳入计算,确保费用按件累加。

3. 实现步骤与代码示例

以下是实现 WooCommerce 购物车中多产品同类附加费累加的完整 PHP 代码。这段代码应放置在您主题的 functions.php 文件中,或通过自定义插件添加。

/** * 为 WooCommerce 购物车中的特定产品组累加附加费用 * * @param WC_Cart $cart WooCommerce 购物车对象 */function action_woocommerce_cart_calculate_fees( $cart ) {    // 仅在非后台且非 AJAX 请求时执行,避免不必要的计算    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {        return;    }    // 费用设置:定义不同的费用类别及其关联产品、金额和名称    // product_id: 接受一个产品ID数组,表示哪些产品会触发此费用    // amount: 单个产品触发的费用金额    // name: 费用在购物车中显示的名称    // total_amount: 累加器,用于存储该类别费用的总和,初始值为 0    $settings = array(        array(            'product_id'    => array( 30, 813, 815 ), // 产品ID数组            'amount'        => 5,            'name'          => __( 'Additional service fee', 'woocommerce' ),            'total_amount'  => 0, // 累加器        ),        array(            'product_id'    => array( 817, 819, 820 ),            'amount'        => 25,            'name'          => __( 'Packing fee', 'woocommerce' ),            'total_amount'  => 0,        ),        array(            'product_id'    => array( 825 ),            'amount'        => 100,            'name'          => __( 'Another fee', 'woocommerce' ),            'total_amount'  => 0,        ),    );    // 遍历购物车中的所有商品,计算每个费用类别的总金额    foreach ( $cart->get_cart_contents() as $cart_item_key => $cart_item ) {              // 获取当前购物车商品的ID        $product_id = $cart_item['product_id'];        // 获取当前购物车商品的数量        $quantity = $cart_item['quantity'];        // 遍历所有费用设置,检查当前商品是否属于某个费用类别        foreach ( $settings as $key => $setting ) {            // 如果当前商品的ID存在于某个费用设置的产品ID数组中            if ( in_array( $product_id, $settings[$key]['product_id'] ) ) {                // 将该商品的费用金额(乘以数量)累加到对应的 total_amount 中                $settings[$key]['total_amount'] += $setting['amount'] * $quantity;            }        }           }    // 再次遍历费用设置,将计算出的总费用添加到购物车    foreach ( $settings as $setting ) {        // 只有当累加的总金额大于 0 时才添加费用        if ( $setting['total_amount'] > 0 ) {            // 添加费用到购物车,第三个参数 false 表示此费用不含税            $cart->add_fee( $setting['name'], $setting['total_amount'], false );            }    }}// 挂载到 woocommerce_cart_calculate_fees 动作,优先级 10,接受 1 个参数add_action( 'woocommerce_cart_calculate_fees', 'action_woocommerce_cart_calculate_fees', 10, 1 );

4. 代码详解

action_woocommerce_cart_calculate_fees( $cart ) 函数:

这是一个 WooCommerce 钩子函数,用于在购物车计算费用时执行自定义逻辑。if ( is_admin() && ! defined( ‘DOING_AJAX’ ) ) return;:这是一个优化措施,确保代码只在前端购物车页面或 AJAX 更新时运行,避免在后台管理界面或非 AJAX 请求时进行不必要的计算。

$settings 数组:

这是核心配置部分,定义了所有的附加费用规则。’product_id’ => array( 30, 813, 815 ):关键改动点。 这里使用了一个数组来包含所有触发此费用的产品ID。请根据您的实际产品ID进行修改。’amount’ => 5:单个产品触发的费用金额。’name’ => __( ‘Additional service fee’, ‘woocommerce’ ):费用在购物车小计中显示的名称。’total_amount’ => 0:关键累加器。 这个字段用于在遍历购物车时累加属于此费用类别的总金额。它必须被初始化为 0。

遍历购物车内容 (foreach ( $cart->get_cart_contents() as $cart_item_key => $cart_item )):

此循环遍历购物车中的每一个商品。$product_id = $cart_item[‘product_id’]; 获取当前商品的ID。$quantity = $cart_item[‘quantity’]; 获取当前商品的数量。

嵌套循环计算费用 (foreach ( $settings as $key => $setting )):

对于购物车中的每个商品,都会再次遍历 settings 数组中的所有费用规则。if ( in_array( $product_id, $settings[$key][‘product_id’] ) ):使用 in_array() 函数检查当前购物车商品的 product_id 是否存在于当前费用规则的 product_id 数组中。这是判断商品是否属于某个费用类别的关键。$settings[$key][‘total_amount’] += $setting[‘amount’] * $quantity;:如果商品匹配,则将该费用规则的 amount 乘以商品的 quantity,然后累加到对应费用规则的 total_amount 中。

添加费用到购物车 (foreach ( $settings as $setting )):

在完成所有商品的遍历和费用累加后,再次遍历 settings 数组。if ( $setting[‘total_amount’] > 0 ):只有当某个费用类别的 total_amount 大于 0 时(即购物车中存在该类别的商品),才将费用添加到购物车。$cart->add_fee( $setting[‘name’], $setting[‘total_amount’], false );:使用 add_fee() 方法将累加后的总费用添加到购物车。第三个参数 false 表示此费用不含税;如果需要含税,可以设置为 true。

add_action( ‘woocommerce_cart_calculate_fees’, … ):

将上述函数挂载到 woocommerce_cart_calculate_fees 动作钩子上,确保在 WooCommerce 计算购物车费用时执行。

5. 注意事项

代码放置位置: 建议将此代码添加到您当前主题的 functions.php 文件中。为了更好的可维护性,更专业的做法是创建一个自定义插件来管理此类功能。产品ID的准确性: 请确保 settings 数组中的产品ID是您希望应用费用的实际产品ID。商品数量处理: 提供的代码已考虑商品数量。如果您不需要根据商品数量累加费用,而只是每个匹配商品收取一次固定费用(无论数量),您可以删除 $quantity = $cart_item[‘quantity’]; 这一行,并将 $settings[$key][‘total_amount’] += $setting[‘amount’] * $quantity; 修改为 $settings[$key][‘total_amount’] += $setting[‘amount’];。测试: 在将代码部署到生产环境之前,务必在开发或测试环境中进行充分测试,以确保费用计算符合预期。优先级: add_action 中的 10 是优先级。如果与其他修改购物车费用的代码冲突,可能需要调整此优先级。

6. 总结

通过上述代码和详细解释,您现在应该能够灵活地在 WooCommerce 购物车中实现对属于同一附加费类别的多个产品进行精确的费用累加。这种方法不仅解决了费用重复计算的问题,还通过清晰的配置和逻辑,提供了强大的可扩展性,以适应各种复杂的附加费场景。正确地管理这些费用将有助于提升您商店的运营效率和用户体验。

以上就是WooCommerce 购物车中多产品同类附加费的精确累加教程的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1320154.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
解决WordPress自定义主题小工具标题不显示问题
上一篇 2025年12月12日 06:32:17
PHP动态网页缓存清理机制_PHP动态网页Session缓存清理优化指南
下一篇 2025年12月12日 06:32:35

相关推荐

  • Grok官方网站直达页_Grok官网官方网页版入口

    Grok官网官方网页版入口为https://grok.com,用户可通过该网站访问网页端服务,支持跨设备同步;同时可下载移动应用或在X平台内使用Grok功能。未订阅用户可体验基础功能,Premium及Premium+需通过X平台订阅,SuperGrok则仅在官网提供,具备更强数据处理能力。账户升级后…

    2026年9月22日
    600
  • PHP如何利用缓存优化实时输出_PHP实时输出与缓存结合优化

    PHP实时输出需结合输出缓冲控制与flush()强制推送,同时考虑服务器和浏览器缓存影响;2. 长时间任务应使用APCu或Redis缓存频繁数据,避免重复计算;3. 动态页面可采用分块输出与片段缓存策略,静态内容从缓存读取,动态部分边生成边输出;4. 更优方案是通过异步任务与Redis存储进度,前端…

    2026年9月22日
    000
  • VS Code中Dockerized PHP项目:解决PHP版本冲突的教程

    本教程旨在解决在VS Code中开发Dockerized PHP项目时,VS Code默认识别宿主机PHP版本而非容器内PHP版本的问题。核心解决方案是利用VS Code的Remote – Containers扩展,实现直接在Docker容器内部进行代码开发,从而确保VS Code及其所…

    2026年9月22日
    200
  • PHP each() 函数的替代方案:自定义实现与常见错误修正

    本文探讨了PHP中已废弃的each()函数的替代方案。针对常见的自定义实现,如myEach(),文章详细指出了其在返回数组结构中常犯的错误,并提供了正确的代码示例,以确保替代函数能够模拟each()的预期行为,帮助开发者编写更健壮、兼容未来的PHP代码。 理解 each() 函数及其废弃背景 在PH…

    2026年9月22日
    000
  • 解决PHP应用中本地文件更新后网页视图不刷新的缓存问题

    本文探讨了PHP应用中,本地JSON或图片文件更新后,网页视图无法实时刷新的常见问题。核心原因在于浏览器缓存机制。文章将提供多种解决方案,包括强制刷新、隐身模式诊断、以及通过URL参数、服务器配置(.htaccess)和文件版本控制来有效管理缓存,确保用户始终获取最新数据。 理解问题:本地文件更新与…

    2026年9月22日
    200
  • Laravel 8 登录后重定向到仪表盘:完整教程

    本教程详细阐述了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种方法。我们将探讨 Laravel 默认的重定向机制、如何正确配置仪表盘路由及其中间件,并提供通过自定义 LoginController 实现精确重定向的示例代码。通过本文,您将全面掌握 Laravel 认证后的重定向流程,并…

    2026年9月22日
    500
  • 一键PHP环境怎么解决网页空白问题_空白页故障诊断

    答案是开启错误提示并检查文件路径与代码逻辑。先启用PHP错误显示,确认配置正确;再核对网站根目录和入口文件是否存在;接着排查代码致命错误及输出缓冲问题,确保无BOM头且session前无输出。 遇到一键PHP环境安装后出现网页空白或空白页问题,通常不是环境完全失效,而是某些关键环节出了错。这类问题在…

    2026年9月21日
    100
  • Bun 1.3 正式发布

    2025年10月10日,高性能 javascript 运行时 bun 发布了 1.3 版本。这是 bun 项目迄今为止最重大的版本更新,标志着 bun 从单纯的运行时工具演变为一个功能完备的全栈 javascript 开发平台。 从运行时到全栈平台的跨越 Bun 1.3 的核心突破在于将前端开发能力…

    2026年9月21日
    100
  • 更偏向移动端?Steam新版商店页引国外玩家批评

    今日,v社正式上线全新版本的steam商店界面,标志着此前长期测试的新设计终于全面启用。新版首页在视觉上更加开阔、简洁,将原先位于左侧的游戏分类菜单与顶部的蓝色导航栏整合为统一的顶部导航条,支持用户直接浏览竞速、潜行等具体游戏类型,并结合用户偏好实现个性化内容推荐。整体布局更贴近移动端操作逻辑,页面…

    2026年9月21日
    100
  • PHP三元运算符HTML输出_PHP三元运算符HTML内容输出

    PHP三元运算符用于在HTML中简洁输出条件内容,基本语法为“条件 ? 值1 : 值2”;2. 常用于动态显示文本、属性或样式,如根据$active输出“启用”或“禁用”;3. 可嵌入HTML标签设置class、disabled等属性,示例中根据登录状态显示不同按钮。 PHP三元运算符用于在HTML…

    2026年9月21日
    200
  • 巧文书AI官网首页官方入口 巧文书AI在线文档编辑官网链接直达

    巧文书AI官网首页官方入口是https://qiaowenshu.cn,该平台提供AI驱动的文档生成、智能解析、语义扩展、在线编辑与保存等功能,支持多场景文案创作和跨设备同步,具备一键润色、风格推荐及模板管理等智能化写作辅助体验。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用…

    2026年9月21日
    100
  • 微信读书网页官方登录入口_微信读书在线阅读官方网站链接

    微信读书在线阅读官方网站链接是https://weread.qq.com/,提供海量图书资源、多设备同步、社交化阅读、听书功能及免费专区与会员体系。 微信读书网页官方登录入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来微信读书在线阅读官方网站链接,感兴趣的网友一起随小编来瞧瞧吧! ht…

    2026年9月21日
    200
  • PHP中基于参考数组过滤多维数组并保持结构一致性

    本教程详细阐述了如何在PHP中,根据一个参考数组来过滤多维数组的特定子数组,并同步移除其他子数组中对应索引的元素,最终实现数组的结构化筛选和重新索引。文章通过实际案例和代码演示,指导读者高效地处理复杂数组的匹配与清理任务。 在php开发中,我们经常会遇到需要对复杂数据结构进行筛选和整理的场景。例如,…

    2026年9月21日
    100
  • Laravel 8 登录后重定向到仪表盘的完整教程

    本教程详细介绍了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种方法。我们将探讨如何利用 Laravel 内置的 $redirectTo 属性,以及如何通过重写 LoginController 中的 login 方法来实现自定义重定向逻辑。此外,教程还将重点讲解正确的路由配置和中间件使用…

    2026年9月21日
    100
  • safari浏览器怎么把标签页固定在最左边_safari浏览器标签页固定最左设置

    Safari可通过“固定标签”功能将常用网页保持在标签栏最左并随启动恢复;2. 手动拖动标签至最左可临时调整顺序但不永久保存;3. 结合书签栏添加常用网站并固定标签,可提升访问效率。 如果您希望在使用 Safari 浏览器时将常用网页始终保持在标签栏的最左侧位置,以便快速访问,可以通过以下方法实现标…

    2026年9月21日
    100
  • 使用本地HTML文件运行JavaScript脚本失败的原因及解决方案

    本文旨在帮助开发者理解在没有Web服务器的情况下,直接通过浏览器打开本地HTML文件时,JavaScript脚本可能无法正常运行的原因,并提供相应的解决方案。文章将深入探讨浏览器安全策略、相对路径问题以及如何正确引入和执行JavaScript脚本,确保你的HTML、CSS和JavaScript代码能…

    2026年9月21日
    100
  • PHP一键环境如何配置URL重写_URL Rewrite规则设置

    开启Apache的mod_rewrite模块并配置AllowOverride All,再在.htaccess中添加重写规则,即可实现URL重写,使URL更简洁利于SEO。 在使用PHP一键环境(如XAMPP、WAMP、phpStudy等)时,开启URL重写(URL Rewrite)功能可以让网站的U…

    2026年9月21日
    200
  • 解决WordPress wp-settings.php中致命错误的实用指南

    当WordPress网站遭遇wp-settings.php中Call to undefined function的致命错误时,通常意味着核心文件已损坏。本教程将指导您通过下载全新WordPress副本并替换站点中wp-admin和wp-includes目录来有效解决此问题,确保网站恢复正常运行,并提…

    2026年9月21日
    100
  • 1688阿里巴巴官网网址 1688阿里巴巴批发商城入口

    1688阿里巴巴官网网址是https://www.1688.com,该平台商品种类丰富,涵盖工业品与消费品,支持行业分类查找、厂家直供和热门榜单更新。 1688阿里巴巴官网网址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来1688阿里巴巴批发商城入口,感兴趣的网友一起随小编来瞧瞧吧! h…

    2026年9月21日
    100
  • 如何从被调用类中获取调用者文件的命名空间

    本文探讨了在PHP中,如何在不通过参数传递的情况下,从一个被调用的工具类中获取到调用该方法的文件的命名空间。通过结合使用`debug_backtrace()`回溯调用栈以定位调用者文件,并利用`token_get_all()`解析文件内容来提取命名空间声明,提供了一种实用的解决方案。文章详细介绍了实…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信