dongzhong1891 2018-05-22 11:55
浏览 52
已采纳

在Woocommerce中根据产品数量替换特定的购物车项目

I am trying to change the cart content based on the quantity of a product in the cart. I only have 5 products in the shop:

  • Product_1 => 1 panel,
  • Product_2 => 12 panels,
  • Product_3 => 18 panels,
  • Product_4 => 30 panels,
  • Product_5 => 60 panels,

They are configured as different products, so no bundles, kits or anything. More than one panel products are obviously cheaper than adding a number of single panels separately.

Then I have also a custom product that calculates the number of panels needed based on floor measures given by the customer and then adds to cart the necessary quantity of single panels.

I Would like to change dynamically the content of the cart when it's reviewed.

So for example, if the floor configurator calculate 54 single panels and added them to the cart, I would like to change the cart item to:

  • 1 Product_4 (30 panels)
  • 1 Product_2 (12 panels)
  • 2 Product_1 (1 panel)
  • and print a message stating the change.

I've checked different solutions but none of them offer this kind of feature:

So, based on this answer thread, I think I need to use hook woocommerce_before_calculate_totals and implement the logic, but need some help since I am a wordpress dev noob.

Note that the add to cart button is called with Ajax in the floor configurator with:

jQuery("button.ajax_add_to_cart").attr("data-quantity", parseInt(numLozasrealW * numLozasrealH));

Any help is appreciated.

  • 写回答

1条回答 默认 最新

  • dongliang1873 2018-05-22 18:59
    关注

    The code bellow should do the trick, It will replace the custom product (quantity) by your other products. You will have to set your custom product ID, your 5 normal product IDs and your custom text notice.

    The code:

    add_action( 'woocommerce_add_to_cart', 'action_before_cart', 20, 3 );
    function action_before_cart( $cart_item_key, $product_id, $quantity ) {
        // HERE set your specific product ID
        $specific_product_id = 862;
    
        if( $product_id != $specific_product_id ) return;
    
        // HERE set your other product IDs related to panels
        $products_panels = array(
            861 => 50, // Product ID => for 50 panels
            860 => 30, // Product ID => for 30 panels
            859 => 18, // Product ID => for 18 panels
            858 => 12, // Product ID => for 12 panels
            857 => 1,  // Product ID => for  1 panel
        );
    
        // Loop through all "panels" products IDs
        foreach ( $products_panels as $product_id => $panels ) {
            if( $quantity >= $panels ){
                $qty = floor($quantity / $panels);
                $quantity = $quantity % $panels;
                $data = 'Panels: '.$panels.' | Quantity: '.$qty.' | Remain: '.$quantity;
                print_pr($data);
                WC()->cart->add_to_cart( $product_id, $qty );
            }
        }
        // Removing the specific product
        WC()->cart->remove_cart_item( $cart_item_key );
    
        // HERE set your custom notice text
        wc_add_notice('Here your custom notice text', 'notice');
    }
    

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

    As you can see below when custom product is added to cart, it's replaced by the other products to match the quantity of panels and display a custom notice:

    enter image description here

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型