Php 有条件更改购物车项目装运类别以更改WooCommerce中的装运成本

Php 有条件更改购物车项目装运类别以更改WooCommerce中的装运成本,php,wordpress,woocommerce,shipping,shipping-method,Php,Wordpress,Woocommerce,Shipping,Shipping Method,在WooCommerce中,我希望根据某些条件,将购物车中的某些产品排除在运输成本计算之外。在用谷歌搜索了几个小时后,我无法找到任何方法来计算剩余产品的运输成本 webshop为各种类型的产品使用许多装运类。各类货物的运费正在加总。当订购一定数量的特定产品时,这些产品将免费发货,但对于购物车中的其他产品,仍然需要计算发货成本,即使它们与免费发货的产品属于相同的发货类别 我尝试的 我的第一个想法是使用woocommerce_package_rates过滤器,去除匹配产品的运输成本。但事实证明这非常

在WooCommerce中,我希望根据某些条件,将购物车中的某些产品排除在运输成本计算之外。在用谷歌搜索了几个小时后,我无法找到任何方法来计算剩余产品的运输成本

webshop为各种类型的产品使用许多装运类。各类货物的运费正在加总。当订购一定数量的特定产品时,这些产品将免费发货,但对于购物车中的其他产品,仍然需要计算发货成本,即使它们与免费发货的产品属于相同的发货类别

我尝试的

我的第一个想法是使用woocommerce_package_rates过滤器,去除匹配产品的运输成本。但事实证明这非常复杂,因为我无法计算这些产品的实际运输成本。此外,购物车中可能有其他具有相同装运类别的产品

然后,我认为解决方案可能是将购物车中产品实例的shipping类更新为Free shipping类,在向woocommerce添加操作后,在cart数据上使用set_shipping_class_id()方法,然后在计算总计挂钩之前:

它将“更改的”shipping_class_id值添加到对象中,但不用于计算运费:原始值仍然保留

在互联网上我发现了许多类似的问题,但每次都是关于完全免费送货或更新产品本身的类别。但就我而言,这不是解决办法

对于这些问题,我采用了各种解决方案,使用了上述挂钩以及woocommerce\u shipping\u rate\u cost,但没有一个解决方案实现了我想要的目标


有没有办法通过编程将某些产品排除在运输成本计算之外,但是仍然要计算购物车中剩余产品的运输成本吗?

在您的案例中,
woocommerce\u cart\u shipping\u包裹
hook是根据特定条件的运输类别变化用于运输成本的正确挂钩,例如:

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文件。测试成功。

我尽量简短,因为我认为我的问题已经很长了。这就是为什么我只提到我使用的钩子和动作。我会更新我的帖子。请注意,我甚至没有寻找编码服务。在我寻找解决方案的过程中,我多次发现了类似的问题,并找到了解决方案,但从未计算过一部分购物车内容的运输成本。我认为这对其他WooCommerce用户/程序员来说也是非常有用的,他们将来可能会面临这个问题。经过一些尝试,我找到了在下面的代码中实现它的方法(如果答案回答了你的问题,你可以请你回答,谢谢你)。有了运输包,它就像魅力一样工作。谢谢!
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;
}