簡體   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