如何添加已删除的装运方法或覆盖它';在Woocommerce中针对特定条件的方法设置?

如何添加已删除的装运方法或覆盖它';在Woocommerce中针对特定条件的方法设置?,woocommerce,shipping-method,Woocommerce,Shipping Method,我排除了免费送货的虚拟产品,工作代码如下。然而,“灵活装运”和“灵活装运”的费率是有问题的,因为当超过免费装运阈值时,它们就会被删除 例如,一个用户购买价值20美元的虚拟产品和价值26美元的其他产品,这使得订单总额为46美元,这将使他们有资格获得免费送货。因为他们有资格免费送货,所以其他价格都被取消了 下面的代码检查,看看非虚拟总额实际上只有26美元,所以他们不应该得到免费送货。他们有资格享受26-44.99美元的价格。这部分工作正常 如果取消免费配送,他们应该获得下一层配送:ID=flexib

我排除了免费送货的虚拟产品,工作代码如下。然而,“灵活装运”和“灵活装运”的费率是有问题的,因为当超过免费装运阈值时,它们就会被删除

例如,一个用户购买价值20美元的虚拟产品和价值26美元的其他产品,这使得订单总额为46美元,这将使他们有资格获得免费送货。因为他们有资格免费送货,所以其他价格都被取消了

下面的代码检查,看看非虚拟总额实际上只有26美元,所以他们不应该得到免费送货。他们有资格享受26-44.99美元的价格。这部分工作正常

如果取消免费配送,他们应该获得下一层配送:ID=flexible\u shipping\u 12\u 2。此方法已删除自身,因为它认为订单总额为46美元

我需要“重新插入”,而不是创建,该方法和#_12_1插入到下面代码中指定的可用装运方法中

我不知道如何重新插入装运方法:

//Exclude virtual products from free shipping

add_filter('woocommerce_package_rates', 'custom_shipping_option', 20, 2 );

function custom_shipping_option($rates, $package){

  $non_virtual_total = 0;

  // Get the cart content total excluding virtual products

  foreach( WC()->cart->get_cart() as $cart_item )

    if( ! $cart_item['data']->is_virtual( ) ){
        $non_virtual_total += $cart_item['line_total'];
    }

  // Disabling methods based on non_virtual_total

 if( $non_virtual_total <  45 && $non_virtual_total >= 25 ){

  foreach ( $rates as $rate_key => $rate )

  if( 'free_shipping' == $rate->method_id )
  unset( $rates[ $rate_key ] );

  if( 'flexible_shipping_12_1' == $rate->method_id )
  unset( $rates[ $rate_key ] );

  //insert flexible_shipping_12_2 method here

        }


    if( $non_virtual_total <  25 ){

    foreach ( $rates as $rate_key => $rate )
    if( 'free_shipping' == $rate->method_id )
      unset( $rates[ $rate_key ] );

    if( 'flexible_shipping_12_2' == $rate->method_id )
      unset( $rates[ $rate_key ] );

    //insert flexible_shipping_12_1 method here 


        }       

return $rates;
//从免费送货中排除虚拟产品
添加过滤器('woocommerce\u package\u rates','custom\u shipping\u option',20,2);
功能自定义装运选项($rates$package){
$non_virtual_总计=0;
//获取购物车内容总数(不包括虚拟产品)
foreach(WC()->cart->get_cart()作为$cart_项目)
如果(!$cart\u项目['data']->是虚拟的()){
$non_virtual_total+=$cart_item['line_total'];
}
//基于非虚拟总体的禁用方法
如果($non_virtual_total<45&$non_virtual_total>=25){
foreach($rate作为$rate\u key=>$rate的费率)
如果('free_shipping'=$rate->method_id)
未设置($rates[$rate_key]);
如果('flexible_shipping_12_1'==$rate->method_id)
未设置($rates[$rate_key]);
//在此处插入灵活的装运方法
}
如果($non_virtual_total<25){
foreach($rate作为$rate\u key=>$rate的费率)
如果('free_shipping'=$rate->method_id)
未设置($rates[$rate_key]);
如果('flexible_shipping_12_2'==$rate->method_id)
未设置($rates[$rate_key]);
//在此处插入灵活的装运方法
}       
返回美元汇率;

}

我相信您只是想将
灵活装运\u 12\u 1
灵活装运\u 12\u 2
装运方法重新添加到
$rates
数组中,对吗

这应该是您所需要的全部:

//insert flexible_shipping_12_1 method here
array_push($rates, "flexible_shipping_12_1");

//insert flexible_shipping_12_2 method here
array_push($rates, "flexible_shipping_12_2");

array\u push
方法只是将新值添加到数组中。

这导致了一个错误:致命错误:未捕获错误:调用/home/dev/staging/1/wp content/plugins/woocommerce/includes/wc cart functions.php中字符串上的成员函数get\u label()。php:345似乎不相关-get\u label不在您的代码或我的解决方案中。希望这意味着代码现在可以像预期的那样工作,它只是发现了另一个bug