在 WooCommerce 中禁用具有特定单词并基于运费 class 的送货方式

Disable shipping methods having a specific word and based on a shipping class in WooCommerce

我使用了 Business Bloomer snippet 并对其进行了一些微调,以根据购物车中 class 件商品的运送情况取消某些运送方式的设置。

它适用于我测试过的 4 种送货方式,但为了在我的网站上完全正常工作,我必须手动列出所有送货方式值,并且我有很多(86 需要取消设置 ifelse 中的 60。)

因此,我想编辑截图,这样我就可以一次取消所有包含相同术语的运输方式,而不是单独查找每个值,但我真的不知道该怎么做。

我有印刷品待售,所以我为包括印刷品在内的订单设置了一些运输方式,为没有订单的订单设置了一些运输方式。因此,我所有的印刷品运输方式的值都以“_print”结尾,而其他方式的值以“_classique”结尾,正如您在下面的代码中看到的那样。

我的目标是禁用所有以“_classique”结尾的送货方式,当购物车中的产品带有“打印”送货 class 时,反之亦然。

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

add_filter( 'woocommerce_package_rates', 'businessbloomer_hide_regular_shipping_method', 10, 2 );

function businessbloomer_hide_regular_shipping_method( $rates, $package ) {
    $shipping_class_target = 35; // shipping class ID
    $in_cart = false;
    foreach( WC()->cart->get_cart_contents() as $key => $values ) {
        if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
        $in_cart = true;
        break;
        }
    }
    if( $in_cart ) { // shipping method with value
        unset( $rates['wbs:2:d6f790a0_colissimo_sans_signature_classique'] ); 
        unset( $rates['wbs:2:d748dcd4_lettre_suivie_classique'] ); 
        unset( $rates['wbs:2:f1058bc8_colissimo_avec_signature_classique'] ); 

    }
    else{
        unset( $rates['wbs:2:1cdf4913_colissimo_sans_signature_print'] );
        unset( $rates['wbs:2:fghla482_lettre_suivie_print'] );
        unset( $rates['wbs:2:g27a1f56_colissimo_avec_signature_print'] );


    }
    return $rates;
}

任何有关如何实现此目的的帮助将不胜感激。 感谢所有愿意花时间阅读本文的人!

已更新

使用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 文件。它应该有效。

Clearing shipping caches:

  • You will need to empty your cart, to clear cached shipping data
  • Or In shipping settings, you can disable / save any shipping method, then enable back / save.

相关:

  • How can I check if a word is contained in another string using PHP?