2016-11-21 11 views
0

特定の基準に基づいて商品の価格を動的に上書きしていますが、商品がカートに追加されたときにajaxとミニカートで価格変更が表示されないようです。元の合計価格を表示します。私はカートそのものの価格を問題なく上書きすることができますが、カートやチェックアウトのページで確認する必要があります。どんなアプローチをとるべきかわからない。私はすべてを試したように感じました。カートの合計がオーバーライドされたカート価格で更新されない

$woocommerce->cart->get_cart_total()が現在のカートの合計を表示するように見えますが、呼び出されたときにadd_action('woocommerce_before_calculate_totals', 'woo_add_discount');フックが実行されていないようです。 実際のカートページに行くと、それは適切な価格設定です。

このコードを追加すると、適切な個別価格が表示されますが、小計は表示されません。カートのページを更新するには、カートのURLをクリックして$ woocommerce-> cart-> get_cart_total()オブジェクトを更新する必要があります。

私も同じことをしているadd_action('woocommerce_before_mini_cart', 'woo_add_discount');を試しました。読み込んだ後にページを更新する必要があります。私は価格をオーバーライドして、すべてのピースを落とすことができない唯一の人ではないと確信しています。

私はこれを試して、2番目のコメントが答えに表示されているのを見て、誰かが同じ問題を抱えていますが答えはありません。 WooCommerce: Add product to cart with price override?

答えて

0

私はこの自分自身を固定してしまっを使用してみてください。私はPaul de Koningの答えを試しました。 apply_filtersに変更すると、価格は$ 0になりました。私はこれが彼らが入るために必要な注文のためだと思う。

ここに私の解決策があった。根本的な原因は、私がカートの変更価格を提供するためにchange price_html関数を使用していたことでした。その機能の中には、add_action呼び出しなどがありました。どういうわけか、注文の問題があったに違いありません。これは、すべての領域が正しく行われていることを確認するための多段階のプロセスです。

使用すると、表示価格を変更し、価格を隠しながら、カートのため、変更の価格を格納するためのセッションを使用せずに、woocommerceの価格を変更したい場合は、以下のようなものを実行します。

のfunctions.php

add_action('woocommerce_get_price_html','special_price'); 

    function special_price($price) { 

     //put any if statements for hiding the cart button and discounting pricing below and return true or false 
     $displayprice = true; 
     $alterprice = true; 

     if($displayprice === true) { 

     add_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10, 2); 
     add_action('init', 'woocommerce_add_to_cart_action', 10); 
     add_action('init', 'woocommerce_checkout_action', 10); 

     } else { 

     remove_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10, 2); 
     remove_action('woocommerce_before_add_to_cart_form', 'woocommerce_template_single_product_add_to_cart', 10, 2);  // 
     remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 10); 
     remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30); 

     //return blank or something like 'Signup to view price' 
     return ''; 

     } 

     //if you are displaying the price (altered) 
     if($displayprice === true && $alterprice === true){ 

     $price = price_manipulator($theid); 
     return $price; 

     //display add to cart and price 

     } 

     //if you are displaying the price (unaltered) 
     return $price  

    } 


    function price_manipulator($theid = '') { 

     if(empty($theid)){ 
     $theid = get_the_ID(); 
     } 

     $product = wc_get_product($theid); 

     //30% off example 
     $newprice = floatval($product->price * (1-0.3)); 

     return $newprice; 
    } 

    /*version of pricing if you are adding something to cart*/ 
    function special_price_cart($theid){ 

       $price = price_manipulator($theid);    

       return $price; 

    } 


    add_action('woocommerce_before_calculate_totals', 'woo_add_discount'); 
    add_action('woocommerce_before_mini_cart', 'woo_add_discount'); //this is if you are using the mini-cart woocommerce widget 

    function woo_add_discount() { 

     global $woocommerce;  

     //create if statements same as if you were displaying the price 
     $displayprice = true; 


     if($displayprice === true){ 

     foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) { 

      $price = special_price_cart($cart_item['data']->id); 
      $price = str_replace('$','',$price); 
      $price = str_replace(',','',$price);    


      if($price > 0){ 

      $cart_item['data']->price = floatval($price); 

      }  

     } 

    } 

    } 
1

apply_filters代わりのadd_action

関連する問題