dongqiao3927 2019-03-17 22:27
浏览 45
已采纳

在Woocommerce中为两个或更多购物车商品启用免费送货

In Woocommerce, I want to offer free shipping based on the number of cart items. First, I began looking at the available plugins and I can't find any simple solution based on quantity.

All I want to do is: buy 2 of anything and get free shipping.

Messing around, I tried the following code:

function free_ship( $is_available ) {
    $count = 0;
    global $woocommerce;
    $items = $woocommerce->cart->get_cart();
    foreach($items as $item) {
        $count++;
    }
    echo $count;

    if ( $count == 1 ) {
        echo 'add one more for free shipping';
        return $is_available;
    } elseif ($count > 1) {
        echo 'you get free shipping';
        return false;
    } else {
        echo 'nothing in your cart';
        return $is_available;
    }
}
add_filter( 'woocommerce_shipping_free_shipping_is_available', 'free_ship' );

But it hangs when adding items to the cart. It also is buggy when removing things from the cart. I'd like to figure this out in PHP, so that I can further add more unique conditions in they happen to pop up in the future.

Have any suggestions?

  • 写回答

1条回答 默认 最新

  • douhui1957 2019-03-18 00:11
    关注

    There are some mistakes in your code, like missing arguments, complications and outdated things… Try the following instead:

    add_filter( 'woocommerce_shipping_free_shipping_is_available', 'free_shipping_for_x_cart_items', 10, 3 );
    function free_shipping_for_x_cart_items( $is_available, $package, $shipping_method ) {
        $item_count = WC()->cart->get_cart_contents_count();
    
        if ( $item_count == 1 ) {
            $notice = __("Add one more for free shipping");
            $is_available = false;
        } elseif ($item_count > 1) {
            $notice = __("You get free shipping");
            $is_available = true;
        }
    
        if ( isset($notice) ) {
            wc_add_notice( $notice, 'notice' );
        }
        return $is_available;
    }
    

    This code goes in function.php file of your active child theme (or active theme). Tested and works.


    The WC_Cart method get_cart_contents_count() get the count of all items (including quantities).

    To get the count of different cart items (without including quantities), replace the line:

    $item_count = WC()->cart->get_cart_contents_count();
    

    with this one:

    $item_count = sizeof($package['contents']);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示