【问题标题】:Disable shipping methods having a specific word and based on a shipping class in WooCommerce禁用具有特定单词并基于 WooCommerce 中的运输类别的运输方法
【发布时间】:2021-02-01 22:53:14
【问题描述】:

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

它适用于我测试过的 4 种运输方式,但为了在我的网站上充分发挥作用,我必须手动列出所有运输方式值,而且我有很多(if 中的 86 和 60 else.)

因此,我想编辑剪辑,以便我可以一次取消设置包含相同术语的所有运输方式,而不是单独查找每个值,但我真的不知道如何。

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

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

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

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 wordpress woocommerce cart shipping-method


    【解决方案1】:

    更新

    使用 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 文件中。它应该可以工作。

    清除运输缓存

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

    相关:

    【讨论】:

    • 糟糕,我删除了我的评论,以为我在没有注意到你的代码更新的情况下发布了它,但也许你在我发布评论后更新了它。无论如何,非常感谢它就像一个魅力。祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2023-03-23
    • 2019-09-04
    • 2018-01-17
    • 2018-11-28
    相关资源
    最近更新 更多