在WooCommerce购物车

时间:2017-03-16 09:51:54

标签: woocommerce hook-woocommerce

我有一家商店,如果批量购买产品,我们会给予折扣(产品的批量报价不同)。那部分已经整理好了。

目前,我使用这样的负面费用来应用折扣:

function sale_custom_price($cart_object) { 
  foreach ($cart_object->cart_contents as $p) {
    $prod_id = $p['product_id'];
    $prod_n = $p['quantity'];
    $prod_price = $p['data']->price;
    $prod_name = $p['data']->post->post_title;
    $prod_total = $p['line_total'];

    /*
    calc_discount: NULL for no discount for this product
                   else
                     array(
                      n => how many are required, e.g. 12
                      free_pcs_deal => how many of these should be free, e.g. 1
                     )
    */
    $discount = calc_discount($prod_id, $prod_n);

    if (is_null($discount)) {
      continue;
    }

    $discount_n = $discount['n'];
    $free_pcs_deal = $discount['free_pcs_deal'];

    if ($discount_n <= 0) {
      continue;
    }

    $discount_txt = $prod_name . ' (' . $discount_n . ' x ' . $free_pcs_deal . ' stk.)';
    $discount = -1 * $discount_n * $free_pcs_deal * $prod_price;

    $cart_object->add_fee('Rabat: ' . $discount_txt, $discount, true, '');
  }
}

add_action( 'woocommerce_cart_calculate_fees', 'sale_custom_price', 2, 1);

但这种情况不受支持,将来也不可能实现。相反,我想自动调整产品价格。

假设客户购买了12件产品A.正常价格是100,但是产品A有大量买入12,只需支付11(买11送一)。因此,目前产品价格为12 * 100 = 1200,负面费用为100.因此,所有12种产品A的平均产品价格为11 * 100/12 = 91.67。我希望在我的购物车中使用它。

但我无法让它在购物车中显示修改后的价格以及正确的line_total和line_subtotal以及订单总数。所以我似乎找不到合适的action / filter

我尝试过这样的事情:

$cart = WC()->cart->cart_contents;

foreach ($cart as $key => $p) {
  $custom_price = 111; // of course replaced by logic calculating the new, modified price
  WC()->cart->cart_contents[$key]['data']->price = $custom_price;
}

我在woocommerce_cart_updatedwoocommerce_before_cart_contentswoocommerce_add_to_cart和其他人中尝试了这种逻辑,但它不会显示更新价格,line_total,订单总数等的正确购物车。

我可以通过woocommerce_cart_item_price挂钩计算和显示更新的价格,但这只是显示,它不在业务逻辑中,因此所有总计都被修改。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

在计算总计之前尝试进行价格自定义。您可以使用此挂钩“woocommerce_before_calculate_totals”并降低挂钩的优先级,以便任何其他插件/自定义都不会覆盖它。

以下是您可以根据需要自定义的一段代码:

function calculate_custom_price( $cart_object ) {

    // Loop for all products in cart
    foreach ( $cart_object->cart_contents as $key => $value ) {

        if(isset($value['_custom_customized']) && !empty($value['_custom_customized']) && (!isset($isProcessed) || empty($isProcessed))) {
            $fltCustomPrice = 0.00;
            $quantity = intval( $value['quantity'] );
            $orgPrice = floatval( $value['data']->price );

            // For all sub products of build your own basket
            foreach($value['_custom_customized'] AS $keyInner => $arrValInner) {
                $fltCustomPrice += floatval($arrValInner['price']) * floatval($arrValInner['quantity']);
            }
            $cart_object->cart_contents[$key]['data']->price = ( $orgPrice + $fltCustomPrice );
        }
    }
}
add_action( 'woocommerce_before_calculate_totals', 'calculate_custom_price', 2, 1 );

答案 1 :(得分:0)

private void rect_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    rect.Focus();
}

在活动主题的functions.php中尝试此代码段

相关问题