微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

结合多种条件,为WooCommerce中的特定运输类别隐藏运输方法

如何解决结合多种条件,为WooCommerce中的特定运输类别隐藏运输方法

我目前正在使用插件摘要的组合来向客户显示运送方式。我想删除插件并将所有条件组合成一个片段。但是我需要一些帮助。

这是我要实现的目标:

先检查规则1(中断),再检查规则2(中断),然后再检查规则3。我已经写出了所有逻辑,只是不确定如何将它们全部组合成一个片段。

规则1:隐藏第1类运输的运输方法(基于Hide shipping methods for specific shipping class in WooCommerce

add_filter( 'woocommerce_package_rates','hide_shipping_method_based_on_shipping_class',10,2 );
function hide_shipping_method_based_on_shipping_class( $rates,$package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE define your shipping class to find
    $class = 150;

    // HERE define the shipping methods you want to hide
    $method_key_ids = array( 
        'wf_shipping_ups:07','wf_shipping_ups:08','wf_shipping_ups:11','wf_shipping_ups:54','wf_shipping_ups:65','wf_shipping_ups:70','wf_shipping_ups:74','free_shipping:2','request_shipping_quote'
    );

    // Checking in cart items
    foreach( $package['contents'] as $item ) {
        // If we find the shipping class
        if( $item['data']->get_shipping_class_id() == $class ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]); // Remove the targeted methods
            }
            break; // Stop the loop
        }
    }
    return $rates;
}

规则2:如果有5种或更多产品,则隐藏第2类运输的运输方式

add_filter( 'woocommerce_package_rates',$package ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $targeted_class_ids = array(182); // Shipping Class To Find
    
    $allowed_max_qty    = 4; // Max allowed quantity for the shipping class
    
    $shipping_rates_ids1 = array( // Shipping Method rates Ids To Hide if more than 4 items are in cart
        'wf_shipping_ups:07','request_shipping_quote'
    );
    
    $shipping_rates_ids2 = array( // Shipping Method rates Ids to Hide if 4 or less items are in cart
        'flat_rate:20','flat_rate:21'
    );
    
    $related_total_qty  = 0; // Initializing

    // Checking cart items for current package
    foreach( $package['contents'] as $key => $cart_item ) {
        if( in_array( $cart_item['data']->get_shipping_class_id(),$targeted_class_ids ) ){
            $related_total_qty += $cart_item['quantity'];
        }
    }
    
    // When total allowed quantity is more than allowed (for items from defined shipping classes)
    if ( $related_total_qty > $allowed_max_qty ) {
        // Hide related defined shipping methods (more than 4 items)
        foreach( $shipping_rates_ids1 as $shipping_rate_id ) {
            if( isset($rates[$shipping_rate_id]) ) {
                unset($rates[$shipping_rate_id]); // Remove Targeted Methods
            }
        }
    } 
    return $rates;
}

规则3:隐藏第3类运输的运输方法

add_filter( 'woocommerce_package_rates',$package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE define your shipping class to find
    $class = 151;

    // HERE define the shipping methods you want to hide
    $method_key_ids = array(
        'flat_rate:20','flat_rate:21'
    );

    // Checking in cart items
    foreach( $package['contents'] as $item ) {
        // If we find the shipping class
        if( $item['data']->get_shipping_class_id() == $class ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]); // Remove the targeted methods
            }
            break; // Stop the loop
        }
    }
    return $rates;
}

这是我的尝试:

add_filter( 'woocommerce_package_rates',$package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE define your shipping class for rule 1 to find
    $class1 = 150;

    // HERE define the shipping methods you want to hide for rule 1
    $method_key_ids1 = array( 
        'wf_shipping_ups:07','request_shipping_quote'
    );

    // HERE define your shipping class for rule 2 to find
    $targeted_class_ids2 = array(182); // Shipping Class To Find
    
    $allowed_max_qty    = 4; // Max allowed quantity for the shipping class rule 2
    
    $shipping_rates_ids1 = array( // Shipping Method rates Ids To Hide for rule 2 if more than 4 items are in cart
        'wf_shipping_ups:07','request_shipping_quote'
    );
    
    $shipping_rates_ids2 = array( // Shipping Method rates Ids to Hide for rule 2 if 4 or less items are in cart
        'flat_rate:20','flat_rate:21'
    );
    
    $related_total_qty  = 0; // Initializing

    // HERE define your shipping class for rule 3 to find

    $class3 = 151;

    // HERE define the shipping methods you want to hide for rule 3
    $method_key_ids3 = array(
        'flat_rate:20','flat_rate:21'
    );

    // Checking in cart items
    foreach( $package['contents'] as $item ) {
        // If we find the shipping class
        if( $item['data']->get_shipping_class_id() == $class1 ){
            foreach( $method_key_ids1 as $method_key_id ){
                unset($rates[$method_key_id]); // Remove the targeted methods
            }
            break; // Stop the loop
        }
    }

    // Checking cart items for current package
    foreach( $package['contents'] as $key => $cart_item ) {
        if( in_array( $cart_item['data']->get_shipping_class_id(),$targeted_class_ids2 ) ){
            $related_total_qty += $cart_item['quantity'];
        }
    }
    
    // When total allowed quantity is more than allowed (for items from defined shipping classes)
    if ( $related_total_qty > $allowed_max_qty ) {
        // Hide related defined shipping methods (more than 4 items)
        foreach( $shipping_rates_ids1 as $shipping_rate_id ) {
            if( isset($rates[$shipping_rate_id]) ) {
                unset($rates[$shipping_rate_id]); // Remove Targeted Methods
            }
            break; // Stop the loop
        }
    } 


    // Checking in cart items
    foreach( $package['contents'] as $item ) {
        // If we find the shipping class
        if( $item['data']->get_shipping_class_id() == $class3 ){
            foreach( $method_key_ids3 as $method_key_id ){
                unset($rates[$method_key_id]); // Remove the targeted methods
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。