提问者:小点点

禁用具有特定单词并基于WooCommerce中的装运类的装运方法


我使用了一个Business Bloomer片段,并对其进行了一点调整,以根据购物车中项目的运输类别取消一些运输方法。

它适用于我测试过的4种配送方式,但为了在我的网站上充分发挥作用,我必须手动列出所有配送方式的值,我有很多(如果<代码>中有86个要取消设置,如果<代码>中有60个要取消设置,否则<代码>中有60个要取消设置)

因此,我想编辑剪报,这样我就可以一次性取消设置包含相同术语的所有装运方法,而不是逐个查找每个值,但实际上不知道如何进行。

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

我的目标是禁用所有以“_classique”结尾的装运方法,当产品在购物车中具有“print”装运类时,反之亦然。

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

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;
}

任何关于如何实现这一目标的帮助都将不胜感激。感谢任何愿意花时间阅读这篇文章的人!


共1个答案

匿名用户

更新

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

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;
}

代码进入函数。活动子主题(或活动主题)的php文件。它应该有效。

清理运输缓存:

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

相关的:

  • 如何使用PHP检查一个单词是否包含在另一个字符串中