繁体   English   中英

Woocommerce:以编程方式更新购物车中的项目

[英]Woocommerce: Programmatically Update Item In Cart

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

我尝试了 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 插件。 我特别有一个产品,它会被给定的用户多次订购。 用户将被允许免费 5 次,只需支付运费,每 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;
    }
}

我想通了……我查看了 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;

        }
    }

}

我将函数更改为具有第二个参数,以便您可以在任何产品中动态使用它,只要您调用正确的 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;
        }
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM