首页 > 解决方案 > 有条件地更改购物车物品运输类别以更改 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,但没有一个我实现了我想要的。

有没有办法以编程方式将某些产品排除在计算运费之外,但仍计算购物车中剩余产品的运费?

标签: phpwordpresswoocommerceshippingshipping-method

解决方案


在您的情况下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 文件中。测试和工作。


推荐阅读