根据WooCommerce中的运输类别,禁用具有特定单词的运输方法

问题描述

我使用了Business Bloomer snippet并对其进行了一些微调,以根据购物车中物品的运输类别来取消某些运输方式。

它可以与我测试过的4种运输方式配合使用,但是为了能在我的网站上正常工作,我必须手动列出所有运输方式值,并且有很多(在if中未设置86 {{1}中的60。)

因此,我想编辑摘录,以便可以一次取消设置所有包含相同术语的所有送货方式,而不必分别查找每个值,但我真的不知道该怎么做。

我有要出售的印刷品,因此我为订单设置了一些运输方式,包括印刷品,另一些为定货。因此,如下面的代码所示,我所有的打印方式都以“ _print”结尾,而其他方式都以“ _classique”结尾。

我的目标是在购物车中具有“打印”运输类别的产品时禁用所有以“ _classique”结尾的运输方式,反之亦然。

到目前为止,我的代码如下:

else

在实现此目标方面的任何帮助将不胜感激。 谢谢那些花时间阅读本文的人!

解决方法

已更新

使用PHP strpos()将使您检查字符串中是否包含单词。然后,您需要对代码进行一些更改才能使其正常工作:

add_filter( 'woocommerce_package_rates','show_hide_shipping_methods',10,2 );
function show_hide_shipping_methods( $rates,$package ) {
    $shipping_class_id = 35; // Targeted shipping class ID
    $found = false;
    
    // Loop through cart items for the current package
    foreach ( $package['contents'] as $cart_item ) {
        if( $cart_item['data']->get_shipping_class_id() == $shipping_class_id ) {
            $found = true;
            break;
        }
    }
    
    // Loop through shipping rates
    foreach ( $rates as $rate_key => $rate ) {
        if ( $found && strpos($rate_key,'_classique') !== false ) {
            unset($rates[$rate_key]); 
        } 
        elseif (! $found && strpos($rate_key,'_print') !== false ) {
            unset($rates[$rate_key]);
        }
    }
    return $rates;
}

代码进入活动子主题(或活动主题)的functions.php文件中。应该可以。

清除运输缓存

  • 您将需要清空购物车,以清除缓存的运输数据
  • 或者在运输设置中,您可以禁用/保存任何运输方式,然后启用回退/保存。

相关: