2017-12-20 40 views
1

私はWooCommerceでWooCommerce購読プラグインを使用しています。WooCommerce非定期購読料

  1. ユーザーが
  2. ユーザーは、サブスクリプション製品を持っているアクティブなサブスクリプションを持っている:の1は、以下の条件が満たされたとき、私は正常品に10%の割引を行うための関数を記述しようとしています彼のカート
function vip_discount() { 

    $woocommerce = WC(); 
    $items = $woocommerce->cart->get_cart(); 
    $vip_product_id = get_subscription_product_id(); 
    $is_vip_in_cart = is_in_cart($vip_product_id); 
    $vip_product_price = 0; 

    foreach ($items as $item) { 
     if($item['variation_id'] === get_subscription_variation_id('monthly') || $item['variation_id'] === get_subscription_variation_id('quarterly') || $item['variation_id'] === get_subscription_variation_id('annually')) { 
      $vip_product_price = $item['line_total']; 
     } 
    } 

    if (wcs_user_has_subscription('', '', 'active') || $is_vip_in_cart) { 
     // Make sure that the calculation is a negative number at the end ALWAYS! 
     $discount = -(10/100) * ($woocommerce->cart->get_displayed_subtotal() - $vip_product_price); 
     print_r($discount); 
     $woocommerce->cart->add_fee('VIP Discount', $discount); 
    } 
} 
add_action('woocommerce_cart_calculate_fees', 'vip_discount'); 

に問題はこのフックが二回実行何らかの理由であるということです。また、それは正しい料金を適用していない。これは、否定的に適用された料金から定期的なアイテムの合計を差し引く代わりに、その料金はサブスクリプション(定期的な)商品の価格自体として終了します。

補足情報や助けをいただければ幸いです。

答えて

0

最初に$woocommerceを使用する場合は、まずglobal $woocommerce;が必要です。同じものの実際の方法と同じようにWC()を使用する方が良いです。 woocommerce_cart_calculate_feesアクションフック付き

は、あなたのフック機能で不足している引数$cartWC_Cartオブジェクト)があります。

関数get_subscription_product_id()は終了しないので、カスタム関数かもしれません...私は何か他のものに置き換えています。

このフックは合計計算の前に実行されるため、表示された小計の代わりにcart_contents_totalを使用する必要があります。

add_action('woocommerce_cart_calculate_fees', 'vip_discount', 10, 1); 
function vip_discount($cart) { 
    if (is_admin() && ! defined('DOING_AJAX')) return; // Exit 

    // Here the rate percentage of 10% to be applied 
    $rate = .10; 

    // Initializing variables 
    $vip_price = $discount = 0; 
    $subscription_in_cart = false; 

    // Loop through the cart items 
    foreach ($cart->get_cart() as $cart_item) { 
     if($cart_item['variation_id'] === get_subscription_variation_id('monthly') || $cart_item['variation_id'] === get_subscription_variation_id('quarterly') || $cart_item['variation_id'] === get_subscription_variation_id('annually')) { 
      $vip_price += $cart_item['line_total']; 
     } 

     // Get an instance of the parent product object (if not parent the product object) 
     $product = wc_get_product($cart_item['product_id']); 

     // Check for simple or variable "subscription" products 
     if($product->is_type('subscription') || $product->is_type('variable-subscription')){ 
      $subscription_in_cart = true; 
     } 
    } 

    // If customer has an active subscription or a product subscription in cart 
    if (wcs_user_has_subscription('', '', 'active') || $subscription_in_cart) { 

     // The discount calculation 
     $discount = ($cart->cart_contents_total - $vip_product_price) * $rate; 

     if($discount > 0){ 
      // Add a negative fee (a discount) 
      $cart->add_fee(__("VIP Discount"), -$discount); // not taxable here 
     } 
    } 
} 

をこのコードは、あなたのアクティブな子テーマ(またはテーマ)のfunction.phpファイルに入るか、また、どのプラグインファイルに:

が、これは代わりに、類似したコードを再訪してみます。

これは動作するはずです。

関連する問題