php - 有条件地更改购物车物品运输类别以更改 WooCommerce 中的运输成本
问题描述
在 WooCommerce 中,我想根据某些条件将购物车中的某些产品排除在计算运费之外。在尝试了几个小时的谷歌搜索后,我找不到任何方法来计算仅剩余产品的运费。
网上商店为各种类型的产品使用了许多运输类别。各种类别的运费正在加起来。当特定产品订购一定数量时,这些产品将免费发货,但对于购物车中的其他产品,即使它们与发货的产品属于同一运输类别,仍然需要计算运费免费。
我试过的
我的第一个想法是使用woocommerce_package_rates过滤器并删除匹配产品的运费。但事实证明这非常复杂,因为我无法计算这些产品的实际运输成本。此外,购物车中可能还有其他具有相同运输等级的产品。
然后我认为解决方案可能是将购物车中产品实例的运输类更新为免费送货类,在向woocommerce_before_calculate_totals钩子添加操作后使用购物车数据上的set_shipping_class_id()方法:
add_action('woocommerce_before_calculate_totals', 'updateShippingClasses', 30, 1);
function updateShippingClasses($rates) {
if (is_admin() && !defined('DOING_AJAX')) {
return;
}
foreach (WC()->cart->get_cart() as $cart_item) {
if (my_condition) {
$cart_item['data']->set_shipping_class_id(1947); // The Free Shipping class ID.
}
}
}
它将“更改”的 shipping_class_id 值添加到对象中,但它不用于计算运费:原始值仍然存在。
在互联网上,我发现了许多类似的问题,但每次都是关于使运输完全免费或更新产品本身的类。但就我而言,这不是解决方案。
我为这些问题采用了各种解决方案,使用上述钩子以及woocommerce_shipping_rate_cost,但没有一个我实现了我想要的。
有没有办法以编程方式将某些产品排除在计算运费之外,但仍计算购物车中剩余产品的运费?
解决方案
在您的情况下woocommerce_cart_shipping_packages
,钩子是用于根据特定条件更改运输类别的运输成本的正确钩子,例如:
add_action('woocommerce_cart_shipping_packages', 'alter_item_shipping_class_for_shipping_cost_change' );
function alter_item_shipping_class_for_shipping_cost_change( $shipping_packages ) {
foreach ( $shipping_packages as $key => $package ) {
foreach ( $package['contents'] as $cart_item_key => $cart_item ) {
if ( true ) {
$package['contents'][$cart_item_key]['data']->set_shipping_class_id(1947);
}
}
}
return $shipping_packages;
}
代码位于活动子主题(或活动主题)的 functions.php 文件中。测试和工作。
推荐阅读
- sql - 如何获取每年点的名称和最大总和值?
- docker - Ubuntu docker-compose 错误 Compose 文件版本
- javascript - 在 facebook 上共享时,角度应用程序中的 og 元标记不起作用
- java - 如何使用现有的 android 应用程序并响应本机 UI?
- php - 上传 csv 文件后获取 MIME 类型“application/octet-stream”?
- flutter - Flutter:如何在字符串中使用材质图标?
- ibm-mq - 部署 MQSeries 相关组合后出现以下错误
- python-3.x - TypeError:'int'对象不支持项目删除python3?
- frontend - 在 Google OAuth 同意屏幕上强制许可
- c++ - 使用 windows 终端在 vs 代码中执行程序