php 根据运输类别有条件地隐藏WooCommerce运输方式

inkz8wg9  于 2023-01-12  发布在  PHP
关注(0)|答案(2)|浏览(113)

This site (here)(WP v4.9)上使用WooCommerce v3.2.4和11个超重/超大发货等级的产品,这些产品适用于统一费率:
加拿大20美元,美国25美元
所有其他产品的统一运费为**$10**(加拿大)和**$15**(美国),除非订单超过**$100**,否则将自动适用免费送货。
我的客户希望在购物车中有任何超重/特大号物品时禁用免费送货。问题是,当购物车中混合有普通和特大号物品时,购物车会显示没有可用的送货方法,并且不会应用任何送货方法。
我正在使用XAdapter Woocommerce Shipping Table Rate插件来应用较高的成本"超重"航运类。
我停用了这个插件,因为我意识到我可以只使用WooCommerce航运区设置来设置特定航运类的统一费率。

我正在使用一些代码:

  • 当购物车中存在"超重"运输类别时,隐藏免费运输和统一费率
  • 隐藏"超重"发运方法(如果该分类不存在)(163是发运分类的标识)...

下面是代码:

add_filter('woocommerce_package_rates', 'wf_hide_shipping_method_based_on_shipping_class', 100, 2);

function wf_hide_shipping_method_based_on_shipping_class($available_shipping_methods, $package){
    $hide_when_shipping_class_exist = array(
        163 => array(
            'flat_rate:1',
            'flat_rate:2',
            'free_shipping:3',
            'free_shipping:5'
        )
    );

    $hide_when_shipping_class_not_exist = array(
        163 => array( 'wf_woocommerce_shipping_pro:overweightoversizeoverweight')
    );

    $shipping_class_in_cart = array();
    foreach(WC()->cart->cart_contents as $key => $values) {
       $shipping_class_in_cart[] = $values['data']->get_shipping_class_id();
    }

    foreach($hide_when_shipping_class_exist as $class_id => $methods) {
        if(in_array($class_id, $shipping_class_in_cart)){
            foreach($methods as & $current_method) {
                unset($available_shipping_methods[$current_method]);
            }
        }
    }

    foreach($hide_when_shipping_class_not_exist as $class_id => $methods) {
        if(!in_array($class_id, $shipping_class_in_cart)){
            foreach($methods as & $current_method) {
                unset($available_shipping_methods[$current_method]);
            }
        }
    }
    return $available_shipping_methods;
}

以下是每个配送区域费率的ID列表:

    • 加拿大**
  • 定期统一费率|内径:flat_rate:1
  • 免费送货|内径:free_shipping:3
  • 本地取件|内径:local_pickup:4
    • 美国**
  • 定期统一费率|内径:flat_rate:2
  • 免费送货|内径:free_shipping:5
kjthegm6

kjthegm61#

    • 更新2:**(无需任何插件,只需设置和代码)

以下功能将始终显示加拿大的"本地提货"配送,并将:
1.隐藏免费送货方式时,"超大"航运类是在购物车项目。对于"统一费率"航运方式,成本将是一个为"超大"航运类设置。

  • 如果购物车项目中未设置"超大"运输类别:
  • 如果购物车金额小于目标免运费金额:隐藏"免运费"。
  • 如果购物车金额超过目标免运费金额:隐藏"统一费率"配送方式。

下面是代码:

add_filter('woocommerce_package_rates', 'wf_hide_shipping_method_based_on_shipping_class', 100, 2);
function wf_hide_shipping_method_based_on_shipping_class($rates, $package){

    // Defining & Initializing variables
    $free_shipping_rates = array(
        'free_shipping:3',
        'free_shipping:5'
    );

    // Defining & Initializing variables
    $shipping_class_id = 163;
    $free = array();
    $over_found = $has_free = false;

    // Check if "Oversize" shipping class (163) is in cart items
    foreach(WC()->cart->get_cart() as $key => $cart_item){
        if($cart_item['data']->get_shipping_class_id() == $shipping_class_id ){
            $over_found = true;
            break;
        }
    }

    // 1. Hiding free shipping but always show Local pickup for Canada
    if( $over_found ){
        foreach($free_shipping_rates as $rate_id) {
            unset( $rates[$rate_id] );
        }
    }
    // 2. Hiding Flat rate OR Free shipping --> depending on cart amount
    //   (but always show Local pickup for Canada)
    else {
        foreach ( $rates as $rate_id => $rate ) {

            // Hide all "Flat rates" when "Free Shipping" is available
            if ( 'free_shipping' === $rate->method_id ) {
                $free[ $rate_id ] = $rate;
                $has_free = true;
            } elseif ( 'local_pickup' === $rate->method_id ) {
                $free[ $rate_id ] = $rate;
            }
        }
        return $has_free ? $free : $rates;
    }
    return $rates;
}
  • 代码在您的活动子主题(或主题)的function.php文件或任何插件文件中。*

在WooCommerce 3上测试并工作。

    • 刷新发货缓存 (有时需要):**

1)首先清空您的购物车。
2)此代码已经保存在function.php文件中。
3)进入装运区设置并禁用一个"统一费率"(例如) 和"保存"。然后重新启用该"统一费率"和"保存"。操作完成,您可以测试它。

avkwfej4

avkwfej42#

这是可能的通过使用Woocommerce Shipping Table Rate,你只需要添加额外的规则。你需要添加7航运规则,你可以看到航运规则在下面的图像:Image contains the shipping rule you need to add
对于上述规则,您将在购物车页面获得所需的结果。我附上了一些不同情况下购物车页面的截图供您参考:注:帽子的运输等级:常规和连帽衫:超重。
Regular and overweight product ordered together
Over wight product with orders over $100
Free shipping for orders amount over $100 with regular items

相关问题