当前位置: 首页 > 知识库问答 >
问题:

运输选项取决于购物车重量和运输类别

越宣
2023-03-14

我在一个使用WooCommerce的WordPress网站上工作。我发现这段代码允许我根据重量设置货运选项。它工作得很好,直到客户还希望在产品上选择货运类别时使用相同的货运选项。

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

function bbloomer_woocommerce_tiered_shipping( $rates, $package ) {

  if ( WC()->cart->cart_contents_weight < 300 ) {

    if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );

  } else {

    if ( isset( $rates['flat_rate:10'] ) ) unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND'] );
  }

return $rates;
}

然后我发现了另一段代码,可以将运输类设置为运输选项。我发现的代码是指unset可用的运输选项,但我想isset货运,因为我们unset它通过购物车重量。但是,我遇到了一个问题,货运类不能再设置为isset而不会引起重大问题。下面是我试图做的货运。

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

function freight_shipping_class_only( $rates, $package ) {

  $shipping_class_target = 193;
  $in_cart = false;
  foreach( WC()->cart->cart_contents as $key => $values ) {
    if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
      $in_cart = true;
      break;
    } 
  }
  if( $in_cart ) {
    unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND']  ); // shipping method with ID (to find it, see screenshot below)
    isset( $rates['flat_rate:10'] );
  }
  return $rates;
} 

有没有办法在一个函数中同时设置购物车重量和货运类别?这将是理想的,因为我希望他们都能通过unsetall FedEx shipping选项和isset货运选项做完全相同的事情。

让我知道,如果你需要我更清楚,或者如果你有任何提示。

谢谢

共有2个答案

杨和蔼
2023-03-14

我找到了一个解决方案,它并不完全是我想要的,但它是有效的。我所做的是将购物车重量更改为超过300磅的任何重量unsetFedEx配送选项。然后,unsetFedEx货运类别的货运选项。这仍然使货运选项在非货运项目上可见,我使用CSS隐藏了该选项。

我仍然对更好的方法持开放态度。所以,如果你有建议,请发送他们我的方式。

下面是我最后做的事情。

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

function bbloomer_woocommerce_tiered_shipping( $rates, $package ) {

if ( WC()->cart->cart_contents_weight < 300 ) {

    if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );

} else {

    if ( isset( $rates['flat_rate:10'] ) ) unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND'] );
}

 return $rates;
}

/** Freight Shipping Class Only **/
add_filter( 'woocommerce_package_rates', 'freight_shipping_class_only', 10, 2 );

function freight_shipping_class_only( $rates, $package ) {
    $shipping_class_target = 193; 
    $in_cart = false;
    foreach( WC()->cart->cart_contents as $key => $values ) {
        if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
           $in_cart = true;
           break;
        } 
     }
     if( $in_cart ) {
        unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'],$rates['fedex:FEDEX_GROUND']  );
     }
     return $rates;
}
尹何平
2023-03-14

由于您使用2次相同的钩子,您可以简单地将您的函数合并为一个。

现在,对于php[isset()][1],您需要在IF语句中使用它作为条件来检查变量是否设置(存在),但它在函数中的IF语句之外没有单独的效果。

因此,在您的第一个函数中,以下内容没有任何影响:

if ( isset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] ) );

因此,您可以尝试这种紧凑而高效的代码:

add_filter( 'woocommerce_package_rates', 'freight_shipping_class_only', 20, 2 );
function freight_shipping_class_only( $rates, $package ) {
    // HERE the targeted shipping class ID
    $targeted_shipping_class = 193;

    // Loop through cart items and checking
    $found = false;
    foreach( $package['contents'] as $item ) {
        if( $item['data']->get_shipping_class_id() == $targeted_shipping_class ){
            $found = true;
            break;
        }
    } 
    
    // The condition
    if ( isset( $rates['flat_rate:10'] ) && ( WC()->cart->get_cart_contents_weight() >= 300 || $found ) ){
        unset( $rates['fedex:PRIORITY_OVERNIGHT'], $rates['fedex:FEDEX_2_DAY'], $rates['fedex:FEDEX_GROUND'] );
    }

    return $rates;
}

代码进入函数。活动子主题(或活动主题)的php文件。它应该会起作用。

 类似资料:
  • 在我的Woocommerce网店里,我有不同的产品。我想根据购物车物品的总重量计算运费: 从到Kilos的成本是, 从到Kilos成本是 事实上,如果我有一个1公斤的产品,运费是,但是如果我的篮子里有10件这个产品,运费仍然是(应该是代替)。 如何根据购物车总重量计算渐进运费?

  • 真实的例子:一位顾客在购物车中购买了以下产品: 产品A,重量:0.2kg,数量:2,装运类别:免费装运 我的客户使用的是一个表费率运输插件,它只能通过使用购物车内容总重量计算运输成本,在这种情况下,它是3.0kg。 但真正的可充电重量只有2.6公斤... 已经到处搜索,找不到任何函数来计算特定装运类别的购物车项目重量小计,因此我们刚刚起草了以下函数,但它似乎不起作用。有人能帮助改进这个功能吗?

  • 购物车类允许项目被添加到session中,session在用户浏览你的网站期间都保持有效状态。这些项目能够以标准的 "购物车" 格式被检索和显示,并允许用户更新数量或者从购物车中移除项目。 请注意购物车类只提供核心的"购物车"功能。它不提供配送、信用卡授权或者其它处理组件。 初始化购物车类 重要:购物车类利用 CodeIgniter 的 Session 类把购物车信息保存到数据库中,所以在使用购物

  • 购物车类允许项目被添加到 session 中,session 在用户浏览你的网站期间都保持有效状态。 这些项目能够以标准的 "购物车" 格式被检索和显示,并允许用户更新数量或者从购物车中移除项目。 重要 购物车类已经废弃,请不要使用。目前保留它只是为了向前兼容。 请注意购物车类只提供核心的 "购物车" 功能。它不提供配送、信用卡授权或者其它处理组件。 使用购物车类 初始化购物车类 将一个项目添加到

  • 问题内容: 我有上面的代码。 如果我在cart_item上运行print_r,我将得到一个多维数组: 我如何只获得product_id? 我试过$ test = 没用 问题答案: 要获取 foreach循环中的每个购物车商品(对于简单产品): 如果是可变产品,请获取 : 或在两种情况下 ( Woocommerce 3+中 的 Object在哪里) : 更新: 循环外使用产品ID 1)打破循环 (仅

  • 我写的函数应该检查是否有在购物车的项目,其中有一个特定的类别。 我的想法是: 我猜,get_cart()函数将返回购物车的内容,我将能够从中获取有关商品类别的信息。我需要知道get_cart()返回数组的结构,所以我写了: 得到 然后,我尝试在get_cart()函数的结果中查找类别名称: 得到了同样的错误。 使用$woocommerce而不是WC()不会产生任何效果,也不会删除 我做错了什么?我

  • 主要内容:连接到每一种旅行方式,交通监控避免碰撞物联网(IoT)在运输系统中具有至关重要的应用。 物联网在航空运输,水运和陆运等所有运输领域都发挥着重要作用。 这些运输领域的所有组件都是使用智能设备(传感器,处理器)构建的,并通过云服务器或将数据传输到网络的不同服务器互连。 连接到每一种旅行方式 交通运输中的物联网不仅适用于从一个地方到另一个地方的旅行,而且更安全,更环保,更方便。 例如,智能汽车同时执行工作,例如导航,通信,娱乐,高效,更可靠

  • 购物车 手淘iOS 5.2.5 Android 5.2.7,天猫客户端暂未支持 Tida.cart({ sellerNick: "莱夫箱包旗舰店", itemId: "42828909348", skuId: "73068526031" }, function (data) { alert(JSON.stringify(data)); }); 该接口支持SPI回