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

The*_*ery 5 php wordpress cart woocommerce

在本网站(此处)上使用 WooCommerce v3.2.4 (WP v4.9) 和 11 种运输类别为超重/超大且适用统一费率的产品:运往加拿大
20 美元,运往美国25 美元。

\n

所有其他产品的统一运费为10 美元(加拿大)和15 美元(美国),除非订单超过100 美元,否则自动免运费。

\n

我的客户希望在购物车中有任何超重/超大物品时禁用免费送货。问题是,当购物车中混合有常规商品和超大商品时,购物车表示没有可用的送货方式,并且没有应用任何送货方式。

\n

我正在使用XAdapter Woocommerce Shipping Table Rate插件将较高的成本应用于“超重”运输类别。

\n

我停用了这个插件,因为我意识到我可以使用 WooCommerce 运输区域设置来为特定运输类别设置统一费率。请参阅下面的屏幕截图:\n我的某个送货区域的统一费率设置

\n

我正在使用一些代码来:

\n
    \n
  • 当购物车中存在“超重”运输类别时,隐藏免费送货和统一费率
  • \n
  • 如果该类别不存在,则隐藏“超重”运输方法(163 是运输类别的 ID) \xe2\x80\xa6
  • \n
\n

这是该代码:

\n
add_filter(\'woocommerce_package_rates\', \'wf_hide_shipping_method_based_on_shipping_class\', 100, 2);\n\nfunction wf_hide_shipping_method_based_on_shipping_class($available_shipping_methods, $package){\n    $hide_when_shipping_class_exist = array(\n        163 => array(\n            \'flat_rate:1\',\n            \'flat_rate:2\',\n            \'free_shipping:3\',\n            \'free_shipping:5\'\n        )\n    );\n\n    $hide_when_shipping_class_not_exist = array(\n        163 => array( \'wf_woocommerce_shipping_pro:overweightoversizeoverweight\')\n    );\n\n    $shipping_class_in_cart = array();\n    foreach(WC()->cart->cart_contents as $key => $values) {\n       $shipping_class_in_cart[] = $values[\'data\']->get_shipping_class_id();\n    }\n\n    foreach($hide_when_shipping_class_exist as $class_id => $methods) {\n        if(in_array($class_id, $shipping_class_in_cart)){\n            foreach($methods as & $current_method) {\n                unset($available_shipping_methods[$current_method]);\n            }\n        }\n    }\n\n    foreach($hide_when_shipping_class_not_exist as $class_id => $methods) {\n        if(!in_array($class_id, $shipping_class_in_cart)){\n            foreach($methods as & $current_method) {\n                unset($available_shipping_methods[$current_method]);\n            }\n        }\n    }\n    return $available_shipping_methods;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

以下是每个运输区域的费率 ID 列表:

\n

加拿大

\n
    \n
  • 常规统一费率 | ID:flat_rate:1
  • \n
  • 免费送货 | ID:free_shipping:3
  • \n
  • 本地取货 | ID:local_pickup:4
  • \n
\n

美国

\n
    \n
  • 常规统一费率 | ID:flat_rate:2
  • \n
  • 免费送货 | ID:free_shipping:5
  • \n
\n

Loi*_*tec 2

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

以下功能将始终显示加拿大的“本地取货”运输,并且将:

  1. 当购物车商品中包含“超大”运输类别时,隐藏免费送货方式。对于“统一费率”运输方式,费用将是“超大”运输类别的费用。
  2. 如果购物车商品中未设置“超大”运输类别:
    • 如果购物车金额小于目标免费送货金额:隐藏“免费送货”。
    • 如果购物车金额超过目标免费送货金额:隐藏“统一费率”送货方式。

这是该代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

代码位于活动子主题(或主题)的 function.php 文件中或任何插件文件中。

在 WooCommerce 3 上测试并有效。


刷新运输缓存(有时需要)
1)首先清空您的购物车。
2) 此代码已保存在您的 function.php 文件中。
3) 进入运输区域设置并禁用一项“统一费率” (例如)和“保存”。然后重新启用“统一费率”和“保存”。你已经完成了,你可以测试它。