2017-12-19 40 views
1

私はいくつかの内部コードに応じて価格計算を更新する方法を知りたいと思います。これはカートアイテムに入る必要がある価格であり、カートアイテムは製品の基本コストのみを表示します。Woocommerce - カスタムカートアイテムの価格計算

技術的には、製品がカートに追加されたときに価格を変更する必要があります。

私はそれがこのように言うアサーションされなければならなかった考え出し:これは/私はset_price()関数を配置する必要がありますトリックを、行いませんので

global $woocommerce; 
$items = $woocommerce->cart->get_cart(); 

foreach($items as $item => $values) { 
    if ($value['product_id'] == $product_id) { 
     $value['data']->set_price($price); 
    } 
} 

。これが呼び出されると、カートはまだ空であり、ループは入力されません。

私の問題は、次の行の$ this-> priceが設定されていないため、get_base_costが呼び出されて「再計算された」価格ではなく基本コストが表示されるため、Woocommerce Bookingsにあるようです。これは予約可能な製品なので、これはもっと難しいようです。 $これをよく見る

public function get_price($context = ‘view’) { 
    return apply_filters('woocommerce_get_price', $this->price ? $this->price : $this->get_base_cost(), $this); 
} 

私は、少なくとも300は、「基本料金」と250支払われなければなら再計算価格ですclass_wc_product_booking、内の両方の価格を見ることができます。

この問題に関連してはならない配列を大量に削除しました。

WC_Product_Booking Object ( 
[availability_rules:WC_Product_Booking:private] => Array () 
[object_type:protected] => product 
[post_type:protected] => product 
[cache_group:protected] => products 
[data:protected] => 
    Array ( 
     [name] => Booking Test 
     [slug] => Booking Test 
     [sku] => 
     [price] => 300 
     [regular_price] => 
     [sale_price] => 
     [rating_counts] => Array () 
     [average_rating] => 0 
     [review_count] => 0 
    ) 
[supports:protected] => Array () 
[id:protected] => 1708 
[changes:protected] => Array ([price] => 250) 
[meta_data:protected] => 
[product_type] => booking 
) 

答えて

2

これは、作業フックのwoocommerce_before_calculate_totalsで実行する必要があります。

add_action('woocommerce_before_calculate_totals', 'custom_cart_item_price', 10, 1); 
function custom_cart_item_price($cart) { 

    if (is_admin() && ! defined('DOING_AJAX')) 
     return; 

    foreach ($cart->get_cart() as $cart_item){ 
     $price = $cart_item['data']->get_price(); // Get the product price 
     $new_price = $price + 30; // the calculation 
     $cart_item['data']->set_price($new_price); // Set the new price 
    } 
} 

このコードは、あなたのアクティブな子テーマ(またはテーマ)のfunction.phpファイルに入るか、また、どのプラグインファイルに:それは、カート項目で、各製品の価格に30を追加して実施例以下に。 $woocommerce->cart


またglobal $woocommerce;代わりWC()->cartに置き換えられました。はい、あなたは、2つのフック以下の多くに

add_filter('woocommerce_add_cart_item' , 'set_woo_prices'); 
add_filter('woocommerce_get_cart_item_from_session', 'set_session_prices', 20 , 3); 

function set_woo_prices($woo_data) { 
    session_start();  
    $tac_dd_discounted_price = $_SESSION['']; // get the updated new price field 

    if (! isset($tac_dd_discounted_price) || empty ($tac_dd_discounted_price)) { return $woo_data; } 
    $woo_data['data']->set_price($tac_dd_discounted_price); 
    $woo_data['my_price'] = $tac_dd_discounted_price; 
    return $woo_data; 
} 

function set_session_prices ($woo_data , $values , $key) { 
    if (! isset($woo_data['my_price']) || empty ($woo_data['my_price'])) { return $woo_data; } 
    $woo_data['data']->set_price($woo_data['my_price']); 
    return $woo_data; 
} 
+0

を助けるセッションで送信する必要がある場合 – achiever

+1

@achieverこのコードは非常に古典的です(SOには多くの回答があります)...あなたの計算の関連コードで質問を更新する方が良いかもしれません...どこでどのようにあなたはこれを実際に作っています。そうすれば、私たちはあなたをより良く助けることができます。使用しているWooCommerceのバージョンに関連する情報も提供してください。 ** Aakanksh Patel **からの新しい答えもうまくいきます。 – LoicTheAztec

+0

私はコードが動作すると確信しています!それはまだ "私"の価格を変更しませんが、それは多くの理由があります。 Woocommerce v。3.2.5 – achiever

1

あなたがカートに送る前に価格のカスタム方法を変更しようとしています私はのfunctions.phpにコードをコピーカート価格はまったく変わらなかった? また、フォームに応じて価格計算を行っており、その価格がcustom_cart_item_price関数内にある必要がありますか?
関連する問題