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

Php Woocommerce:以编程方式更新购物车中的项目,php,wordpress,woocommerce,Php,Wordpress,Woocommerce,我需要通过编程和动态更改购物车中物品的价格 我尝试了各种各样的动作挂钩、购物车和会话对象的组合,但似乎没有任何效果。我想这不会那么有挑战性 add_action( 'woocommerce_before_calculate_totals', 'change_cart_item_price' ); function change_cart_item_price( $cart_object ) { foreach ( $cart_object->cart_contents as $

我需要通过编程和动态更改购物车中物品的价格

我尝试了各种各样的动作挂钩、购物车和会话对象的组合,但似乎没有任何效果。我想这不会那么有挑战性

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;
        }
   }
}
上面的代码仅在结帐页面或更新购物车时更改每个项目的价格(即:从购物车中移除项目时调用挂钩),但不能无限期地更改

我正在使用WooForms附加组件。我有一个特别的产品,它将由给定的用户订购多次。用户将被允许5倍免费,只收取运费,每超过5将是20美元。我有很多代码和功能,重力窗体挂钩动态填充字段。运输是特定于重力表单中的字段的,因此我将该计算留给重力表单

我的问题是,如果用户从他们的订单中减少了该产品的数量(从购物车中删除其中一个项目),它应该重新计算购物车中相同产品的每一个项目的价格,否则他们可能会被多付费用(以前是第六位的项目现在是第四位,但价格保持不变,这是不应该的)

因此,每次从购物车中取出物品时,我都会根据该特定产品的数量重新计算购物车中每件物品的价格

---编辑---

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

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

我将函数更改为具有第二个参数,这样,只要调用正确的id,您就可以在任何产品中动态使用它。我还将函数返回值设置为成功或错误消息。这样你就可以知道它是否被改变了,如果是的话,价格是多少。希望这有帮助。 顺便说一下,在更新购物车时再次调用此函数可以解决重新计算问题。如果我能看到$function\u to\u get\u new\u 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;
        }
   }
}

我想出来了。。。我查看了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;

        }
    }

}

不起作用的代码在哪里?我们最好能看看你在做什么,帮你解决问题。谢谢,杰克。我已经更新了代码,并对我的问题进行了更详细的描述。我想我只是在寻找合适的对象或钩子。你看过这个吗?隐马尔可夫模型。。。这里没有什么变化。