【问题标题】:Show or hide shipping methods based on number of cart items for specific shipping class根据特定运输类别的购物车商品数量显示或隐藏运输方式
【发布时间】:2020-08-22 16:56:38
【问题描述】:

仅当购物车包含特定运输类别的 4 件或更少产品时,我才尝试取消设置两种运输方式。

运送方式:flat_rate:20 和 flat_rate:21

运输等级:182

这就是我所拥有的:

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;

    // Shipping Class To Find
    $class = 182;

    // Number Of Shipping Class Items In Cart
    $amount = 4;

    // Shipping Methods 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 and Number of Items
        if( $item['data']->get_shipping_class_id() == $class && count($package['contents']) <= $amount ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]); // Remove Targeted Methods
            }
            break; // Stop The Loop
        }
    }
    return $rates;
}

我想把上面的逻辑和下面的逻辑结合起来:

add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package ) {
    $targeted_class_ids = array(182); // Shipping Class To Find
    $allowed_max_qty    = 4; // Max allowed quantity for the shipping class
    $shipping_rates_ids = array( // Shipping Method rates Ids To Hide
        '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'
    );
    
    $related_total_qty  = 0;

    // 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
        foreach( $shipping_rates_ids as $shipping_rate_id ) {
            if( isset($rates[$shipping_rate_id]) ) {
                unset($rates[$shipping_rate_id]); // Remove Targeted Methods
            }
        }
    }
    return $rates;
}

创建以下逻辑:

1.如果购物车中有 4 件或更少的运输类别 181 的产品,请取消设置以下运输方式:

  • 'flat_rate:20'
  • 'flat_rate:21'

2。如果购物车中有 5 种或更多的运输类别 181 的产品,请取消设置以下运输方式:

  • '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'

如果我单独使用它们,这两个代码都可以工作。但是当我尝试同时使用两者时出现错误。

我收到以下错误: 无法重新声明 hide_shipping_method_based_on_shipping_class()(之前在 /functions.php:272 中声明)

【问题讨论】:

    标签: php wordpress woocommerce shipping-method product-quantity


    【解决方案1】:

    您应该为每个代码 sn-p 使用不同的函数名称,但最好的方法是将所有内容合并到一个唯一的函数中。

    这是使它在独特功能中工作的方法(对于来自特定运输方式的物品):

    • 当购物车中的商品不超过 4 件时隐藏一些送货方式
    • 当购物车中的商品不超过 4 件时隐藏一些其他运输方式

    代码:

    add_filter( 'woocommerce_package_rates', 'show_hide_shipping_methods_based_on_shipping_class', 10, 2 );
    function show_hide_shipping_methods_based_on_shipping_class( $rates, $package ) {
        $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',
            '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',
        );
        
        $shipping_rates_ids2 = array( // Shipping Method rates Ids to Hide if 4 or less items are in cart
            'flat_rate:20',
            'flat_rate:20',
        );
        
        $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
                }
            }
        } else {
            // Hide related defined shipping methods (4 or less items)
            foreach( $shipping_rates_ids2 as $shipping_rate_id ) {
                if( isset($rates[$shipping_rate_id]) ) {
                    unset($rates[$shipping_rate_id]); // Remove Targeted Methods
                }
            }
        }
        return $rates;
    }
    

    代码在您的活动子主题(或活动主题)的functions.php 文件中。未经测试它应该可以工作。

    刷新运输缓存:

    1. 此代码已保存在您的 functions.php 文件中。
    2. 在运输区域设置中,禁用/保存任何运输方式,然后启用返回/保存。

      您已完成,您可以对其进行测试。

    处理物品数量而不是物品累计数量:

    替换:

    $related_total_qty += $cart_item['quantity'];
    

    通过

    $related_total_qty++;
    

    【讨论】:

    • 这很好用。我遇到的唯一问题是此代码现在干扰了基于运输类禁用运输方法的插件。似乎此代码优先于插件。所以我要做的就是摆脱插件并手动编写代码来实现我的目标。再次感谢您与我分享此解决方案。
    【解决方案2】:

    我假设您已经通过一个接一个地编写这两个代码 sn-p 来组合它们。

    由于您使用了两次相同的函数名,因此出现错误:无法重新声明.....

    因此,您可以尝试通过像这样重命名第二个 sn-p 的函数名称来修复它 -

    add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class_logic_2', 10, 2 );
    function hide_shipping_method_based_on_shipping_class_logic_2( $rates, $package ) {
        // other stuffs
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      相关资源
      最近更新 更多