2013-04-01 9 views
27

Woocommerceでは、カートの重量が100ポンドを超える場合、顧客の注文全体に10%の割引を適用する方法を見つけようとしています。私はこれを達成する方法の一部です。次のステップでは、プログラム/関数/フック経由でクーポンコードをfunctions.phpに適用する方法を探しています。Woocommerceでプログラムでクーポンを適用するにはどうすればよいですか?

私は関数woocommerce_ajax_apply_coupon(http://docs.woothemes.com/wc-apidocs/function-woocommerce_ajax_apply_coupon.html)を使用することができますが、私はそれを使用する方法が不明です。

これまで、cart.phpを変更してカート内のすべての商品の合計重量を取得しました。割引を適用するクーポンを作成しました(手動で入力した場合)。 .phpを使用して重量を確認し、ユーザーにメッセージを表示します。

EDIT:部分コードが削除され、完成したコードが以下のソリューションに含まれています。


ガーニングフレニアです。ここで成功した条件が満たされたときに割引クーポンを適用しても、それがもはや満たさだときにそれを削除していない作業最終結果です:

/* Mod: 10% Discount for weight greater than 100 lbs 
Works with code added to child theme: woocommerce/cart/cart.php lines 13 - 14: which gets $total_weight of cart: 
     global $total_weight; 
     $total_weight = $woocommerce->cart->cart_contents_weight; 
*/ 
add_action('woocommerce_before_cart_table', 'discount_when_weight_greater_than_100'); 
function discount_when_weight_greater_than_100() { 
    global $woocommerce; 
    global $total_weight; 
    if($total_weight > 100) { 
     $coupon_code = '999'; 
     if (!$woocommerce->cart->add_discount(sanitize_text_field($coupon_code))) { 
      $woocommerce->show_messages(); 
     } 
     echo '<div class="woocommerce_message"><strong>Your order is over 100 lbs so a 10% Discount has been Applied!</strong> Your total order weight is <strong>' . $total_weight . '</strong> lbs.</div>'; 
    } 
} 

/* Mod: Remove 10% Discount for weight less than or equal to 100 lbs */ 
add_action('woocommerce_before_cart_table', 'remove_coupon_if_weight_100_or_less'); 
function remove_coupon_if_weight_100_or_less() { 
    global $woocommerce; 
    global $total_weight; 
    if($total_weight <= 100) { 
     $coupon_code = '999'; 
     $woocommerce->cart->get_applied_coupons(); 
     if (!$woocommerce->cart->remove_coupons(sanitize_text_field($coupon_code))) { 
      $woocommerce->show_messages(); 
     } 
     $woocommerce->cart->calculate_totals(); 
    } 
} 

答えて

27

まず、(http://docs.woothemes.com/document/create-a-coupon-programatically/経由)の割引クーポンを作成します。

$coupon_code = 'UNIQUECODE'; // Code - perhaps generate this from the user ID + the order ID 
$amount = '10'; // Amount 
$discount_type = 'percent'; // Type: fixed_cart, percent, fixed_product, percent_product 

$coupon = array(
    'post_title' => $coupon_code, 
    'post_content' => '', 
    'post_status' => 'publish', 
    'post_author' => 1, 
    'post_type'  => 'shop_coupon' 
);  

$new_coupon_id = wp_insert_post($coupon); 

// Add meta 
update_post_meta($new_coupon_id, 'discount_type', $discount_type); 
update_post_meta($new_coupon_id, 'coupon_amount', $amount); 
update_post_meta($new_coupon_id, 'individual_use', 'no'); 
update_post_meta($new_coupon_id, 'product_ids', ''); 
update_post_meta($new_coupon_id, 'exclude_product_ids', ''); 
update_post_meta($new_coupon_id, 'usage_limit', '1'); 
update_post_meta($new_coupon_id, 'expiry_date', ''); 
update_post_meta($new_coupon_id, 'apply_before_tax', 'yes'); 
update_post_meta($new_coupon_id, 'free_shipping', 'no'); 

は、その後、あなたのためにそのクーポンを適用します。

最後の関数は、BOOL値を返します
if (!$woocommerce->cart->add_discount(sanitize_text_field($coupon_code))) 
    $woocommerce->show_messages(); 

:割引が成功した場合、それは任意の上のために失敗した場合にFALSE、TRUEをさまざまな理由のe。

+0

私はすでにバックエンドにクーポンを持っています: "999"私はクーポンを適用するためにあなたが提供したコードを追加しました。しかし、私がwoocommerceカートページに行くと、私は今エラーを取得しています:行65 [if_start add_discount]の[path to ...] functions.phpの非オブジェクト上のメンバ関数add_discount()を呼び出してください。オリジナルの投稿のコードを更新して、どのように見えるかを示します。 – msargenttrue

+1

'$ total_weight'行とともに' global $ woocommerce; 'を追加してみてください。 – Freney

+0

ありがとう、それは働いた!だから今私は正常に割引を適用することができますが、今私は別の問題に気付いています...ユーザーがいくつかのカートアイテムを削除し、カートが100ポンド以下に戻った場合、割引はまだそこにあります。カートが条件を満たしていない場合、ユーザーがこのクーポンを利用することができないように、割引を削除する方法を探しています。 add_discountの逆の方法で動作するremove_discount関数があると思いますが、私はWoocommerce APIドキュメントで見つけられませんでした:http://docs.woothemes.com/wc-apidocs/ – msargenttrue

6

私はこのソリューションを使用しましたが、OPが書いたバグがあります。ユーザーがカートのプレビューをスキップして、チェックアウトフォームにまっすぐ進むと、クーポンは適用されません。ここに私の解決策がありました。

// Independence day 2013 coupon auto add 
// Add coupon when user views cart before checkout (shipping calculation page). 
add_action('woocommerce_before_cart_table', 'add_independence_day_2013_coupon_automatically'); 

// Add coupon when user views checkout page (would not be added otherwise, unless user views cart first). 
add_action('woocommerce_before_checkout_form', 'add_independence_day_2013_coupon_automatically'); 

// Check if php function exists. If it doesn't, create it. 
if (!function_exists('add_independence_day_2013_coupon_automatically')) { 

    function add_independence_day_2013_coupon_automatically() { 

     global $woocommerce; 
     $coupon_code = 'independencedaysale'; 
     $bc_coupon_start_date = '2013-06-30 17:00:00'; 
     $bc_coupon_end_date = '2013-07-08 06:59:59'; 

     // Only apply coupon between 12:00am on 7/1/2013 and 11:59pm on 7/7/2013 PST. 
     if ((time() >= strtotime($bc_coupon_start_date)) && 
      (time() <= strtotime($bc_coupon_end_date))) { 

      // If coupon has been already been added remove it. 
      if ($woocommerce->cart->has_discount(sanitize_text_field($coupon_code))) { 

       if (!$woocommerce->cart->remove_coupons(sanitize_text_field($coupon_code))) { 

        $woocommerce->show_messages(); 

       } 

      } 

      // Add coupon 
      if (!$woocommerce->cart->add_discount(sanitize_text_field($coupon_code))) { 

       $woocommerce->show_messages(); 

      } else { 

       $woocommerce->clear_messages(); 
       $woocommerce->add_message('Independence day sale coupon (10%) automatically applied'); 
       $woocommerce->show_messages(); 

      } 

      // Manually recalculate totals. If you do not do this, a refresh is required before user will see updated totals when discount is removed. 
      $woocommerce->cart->calculate_totals(); 

     } else { 

      // Coupon is no longer valid, based on date. Remove it. 
      if ($woocommerce->cart->has_discount(sanitize_text_field($coupon_code))) { 

       if ($woocommerce->cart->remove_coupons(sanitize_text_field($coupon_code))) { 

        $woocommerce->show_messages(); 

       } 

       // Manually recalculate totals. If you do not do this, a refresh is required before user will see updated totals when discount is removed. 
       $woocommerce->cart->calculate_totals(); 

      } 

     } 

    } 

} 
関連する問題