Woocommerce:以编程方式更新购物车中的商品

时间:2014-06-10 02:42:22

标签: php wordpress woocommerce

我需要以编程方式动态更改购物车中商品的价格。

我尝试过各种Woocommerce动作挂钩,推车和会话对象的组合,但似乎没有什么可以做的。我认为这不会那么具有挑战性。任何帮助表示赞赏!

add_action( 'woocommerce_before_calculate_totals', 'change_cart_item_price' );

function change_cart_item_price( $cart_object ) {

    foreach ( $cart_object->cart_contents as $key => $value ) {

        if( 123 == $value['data']->id ) {

            $new_price = function_to_get_new_price( $value, get_current_user_id( ) );
            $value['data']->price = $new_price;

        }

   }

}

上述代码仅在结帐页面或更新购物车时更改每件商品的价格(即:从购物车中删除商品时调用挂钩),但不是无限期。

我正在使用Woocommerce Gravity Forms插件。我有一个特别的产品,由给定的用户多次订购。用户将被允许5x免费只收取运费,每个5以上将是20美元。我有这么多编码和功能与Gravity Forms钩子动态填充字段。运输特定于重力形式的字段,因此我将该计算留给重力表格。

我的问题是,如果用户从订单中减少了此产品的数量(从购物车中删除了其中一件商品),则应重新计算购物车内同一产品的每件商品的价格,否则他们会可能会过度充电(以前是第6项的项目现在是第4项,但价格保持不变,不应该

因此,我想根据特定产品的数量,每次从购物车中移除某些商品时,重新计算购物车中每件商品的价格。

---编辑---

以上代码有效,但我意识到问题必须是我用来显示价格的自定义循环......

foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
    $_product = $cart_item['data'];
    if( 123 == $_product->post->ID ) {
        $price_not_updated = $cart_item['data']->price;
    }
}

2 个答案:

答案 0 :(得分:0)

我将函数更改为具有第二个参数,以便您可以在任何产品中动态使用它,只要您调用正确的ID即可。我还将函数返回值设置为成功或错误消息。通过这种方式,您可以知道它是否已更改,如果是,则可以知道更改的价格。希望这可以帮助。  顺便说一句,更新购物车时再次调用此功能应解决重新计算问题。如果我能看到你的$ function_to_get_new_price()函数的代码,那就太棒了。

add_action( 'woocommerce_before_calculate_totals', 'change_cart_item_price' );

function change_cart_item_price($id, $cart_object ) {

    foreach ( $cart_object->cart_contents as $key => $value ) {

        if( $id == $value['data']->id ) {

            $new_price = function_to_get_new_price( $value, get_current_user_id( ) );
            $value['data']->price = $new_price;

            $successMsg = "The price of item $value['data']->id was set to $value['data']->price".;
           return $successMsg;

        }else{
           $errorMsg = "Price was not changed!";
           return $errorMsg;
        }
   }
}

答案 1 :(得分:0)

我想通了......我看了一下woocommerce购物车文档,基本上意识到我得到的价格尚未计算。因此,在运行循环之前,我必须执行我最初想要更改价格的操作。

感谢您的帮助!

function getUpdatedCartPrices() {

    do_action( 'woocommerce_before_calculate_totals', WC()->cart );

    $horray_updated_prices_works = array();

    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $_product = $cart_item['data'];
        if( 123 == $_product->post->ID ) {

            $horray_updated_prices_works[] = $cart_item['data']->price;

        }
    }

}