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

时间:2018-05-22 11:55:24

标签: php wordpress woocommerce cart product

我正在尝试根据购物车中产品的数量更改购物车内容。我店里只有5件商品:

  • Product_1 => 1个小组,
  • Product_2 => 12个面板,
  • Product_3 => 18个面板,
  • Product_4 => 30个面板,
  • Product_5 => 60个面板,

它们被配置为不同的产品,因此没有捆绑包,套件或任何东西。不止一种面板产品明显比单独添加多个单面板便宜。

然后我还有一个定制产品,根据客户给出的楼层尺寸计算所需的面板数量,然后将购买的单面板数量增加到购物车。

我想在审核时动态更改购物车的内容。

所以例如,如果楼层配置器计算 54个单面板并将它们添加到购物车,我想将购物车项目更改为:

  • 1 Product_4(30个面板)
  • 1 Product_2(12个面板)
  • 2 Product_1(1个小组)
  • 并打印一条说明更改的消息。

我已经检查了不同的解决方案,但没有一个提供此类功能:

所以,基于this answer thread,我认为我需要使用hook woocommerce_before_calculate_totals并实现逻辑,但需要一些帮助,因为我是wordpress dev noob。

请注意,在楼层配置器中使用Ajax调用“添加到购物车”按钮:

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

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

下面的代码可以解决这个问题,它将替换您的其他产品的定制产品(数量)。您必须设置自定义产品ID,5个普通产品ID和自定义文本通知。

代码:

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');
}

代码放在活动子主题(或活动主题)的function.php文件中。经过测试和工作。

如下所示,当自定义产品添加到购物车时,它会被其他产品替换,以匹配面板数量并显示自定义通知:

enter image description here