【问题标题】:In woocommerce_before_calculate_totals hook, set_price calculations added twice在 woocommerce_before_calculate_totals 挂钩中,set_price 计算添加了两次
【发布时间】:2018-10-01 12:30:16
【问题描述】:

我在我的网站上使用 Woocommerce 和 Event Ticket 插件,当客户购买门票时,我不得不硬编码一个选择字段,并且根据他们的选择,价格会相应上涨。

其中大部分似乎工作正常,然后选择将保存为购物车数据的一部分。然后,一旦他们单击“添加到购物车”按钮,我就会尝试更新产品价格,以便将新价值添加到产品价格中。

以下是我所拥有的,它似乎正在更新价格,但令人讨厌的是,它添加了两次 $pickup_price(所以它添加了 6 而不是 3)

奇怪的是,如果我在购物篮阶段更改数量并更新,它会得到正确的值,而不是在最初添加时。

我做错了什么以及如何防止这个问题?

这是我的代码:

add_action( 'woocommerce_before_calculate_totals', 'add_pickup_cost', 10, 1 );
function add_pickup_cost( $cart_object, $cart_item_data ) {

     foreach ( $cart_object->get_cart() as $cart_item ) {

          $wc_product = $cart_item['data'];
          // My custom field which is returning the additional cost
          $pickup_price = $cart_item['pickupOptions'];

          $product_price = method_exists( $wc_product, 'get_price' ) ? floatval($wc_product->get_price()) : floatval($wc_product->price);
          $new_price = $product_price + $pickup_price;
          method_exists( $wc_product, 'set_price' ) ? $wc_product->set_price( $new_price ) : $wc_product->price = $new_price;
     }
}

【问题讨论】:

    标签: php wordpress woocommerce cart product


    【解决方案1】:

    你遗漏了一些小东西,我已经稍微简化了你的代码:

    add_action( 'woocommerce_before_calculate_totals', 'add_pickup_cost', 10, 2 );
    function add_pickup_cost( $cart ) {
    
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
            return;
    
        foreach ( $cart->get_cart() as $cart_item ) {
            if( isset( $cart_item['pickupOptions'] ) && ! empty( $cart_item['pickupOptions'] ) ){
            // WC_Product object instance
            $product = $cart_item['data'];
    
            // Get cart item price
            $price  = method_exists( $product, 'get_price' ) ? floatval($product->get_price()) : floatval($product->price);
            $price += (float) $cart_item['pickupOptions']; // Add "Pickup option to the price
    
            // Set the new price
            if( method_exists( $product, 'set_price' ) ) 
                $product->set_price( $price )
            else
                $product->price = $price;
            }
        }
    }
    

    代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

    经过测试并且有效。

    【讨论】:

    • @LocicTheAztec 感谢您的回复。我试过使用你的代码,但不幸的是它仍然添加了两次额外的“pickupOptions”值(所以不是增加 3 英镑,而是增加了 6 英镑)。
    • @WillL 对我来说,这段代码没有问题。没有重复......所以可能是某个特定的地方导致了你的问题。
    • @LocicTheAztec 奇怪的是,当我单击购物车上的“更新购物车”按钮或刷新购物车时,价格会更新到正确的金额。但是从最初的添加到购物车开始,当它把我带到那里时,它显示它两次添加了这个价格。知道为什么会这样,或者我可以在添加到购物车后强制更新/刷新吗?
    • @WillL 这个问题似乎很难解决,因为它可能与您的主题、某些特定插件或最后一些其他自定义代码有关...
    • @LoicTheAztec 将; 添加到$product->set_price( $price ) 代码行。
    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 2019-06-16
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多