首页 > 解决方案 > 根据 Woocommerce 中的运输类别有条件地设置运输成本

问题描述

我们在我们的 Woocommerce 网站上销售样品产品,这只是一个可变产品。该产品具有独特的运输等级,允许以 1.99 的价格交付。

实际上,如果项目属于该唯一的运输类别,即使有其他项目,也始终设置此成本。

如果可能,我希望仅当特定商品(来自该独特的运输类别) 单独在购物车中时才启用该运输成本。

任何帮助表示赞赏。

标签: phpwordpresswoocommerceproductshipping-method

解决方案


如果具有特定运输类别的物品与其他物品融为一体,则以下挂钩函数会将运输成本设置为 0:

add_filter('woocommerce_package_rates', 'conditional_shipping_class_cost', 15, 2);
function conditional_shipping_class_cost( $rates, $package ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;

    // HERE define the targeted shipping method
    $shipping_class = 'Extra';

    // Initializing variables
    $found = $others = false;

    // Loop through cart items and checking for the specific product
    foreach( $package['contents'] as $item ) {
        if( $item['data']->get_shipping_class() == sanitize_title($shipping_class) ){
            $found = true; // Has the shipping class
        } else {
            $others = true; // NOT the shipping class
        }
    }

    // When items with the defined shipping are not alone in cart
    if( $found && $others ){
        // Loop through shipping rates
        foreach ( $rates as $rate_key => $rate ){
            // For Flat rate and Local pickup shipping methods
            if( $rate->method_id == 'flat_rate' ) {
                // Set the cost to zero
                $rates[$rate_key]->cost = 0;

                $rates[$rate_key]->label = 'f: '.$found.' | o: '.$others.' ';

                // Initializing variables
                $has_taxes = false;
                $taxes = [];

                // Loop through the shipping taxes array (as they can be many)
                foreach ($rates[$rate_key]->taxes as $key => $tax){
                    if( $rates[$rate_key]->taxes[$key] > 0 ){
                        // Set the tax cost to zero
                        $taxes[$key] = 0;
                        $has_taxes   = true;
                    }
                }
                // Set new taxes cost array
                if( $has_taxes )
                    $rates[$rate_key]->taxes = $taxes;
            }
        }
    }

    return $rates;
}

此代码位于您的活动子主题(或主题)的 function.php 文件中。测试和工作。


推荐阅读