2013-04-01 6 views
27

Woocommerce Alışveriş sepetindeki ağırlık 100 lbs'nin üzerindeyse tüm müşterinin siparişine% 10 indirim uygulamanın bir yolunu bulmaya çalışıyorum. Bunu başarmanın bir yoluyum. Bir sonraki adımda, function.php aracılığıyla action/hook yoluyla bir kupon kodunu programlı olarak uygulamanın bir yolunu arıyorum.Woocommerce'de nasıl bir kupon programlı olarak uygularım?

Bunu yapmak için woocommerce_ajax_apply_coupon işlevini kullanabilirim (http://docs.woothemes.com/wc-apidocs/function-woocommerce_ajax_apply_coupon.html) ama nasıl kullanacağından emin değilim.

Şimdiye kadar cart.php'yi sepetteki tüm ürünlerin toplam ağırlığını almak için değiştirdim, indirim uygulayan bir kupon oluşturdum (elle girilirse) ve bazı kodları fonksiyonlara ekledim Ağırlığı kontrol etmek ve kullanıcıya bir mesaj görüntülemek için .php. DÜZENLEME: Kısmi kod kaldırıldı, tamamlanmış kod aşağıdaki çözümde yer aldı.


Yardım için teşekkürler Freney. İşte başarılı koşul karşılandığında indirim kuponu geçerlidir çalışma Sonuçta olduğunu ve ayrıca artık tanıştı zaman kaldırır:

/* 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(); 
    } 
} 

cevap

27

Birincisi, (http://docs.woothemes.com/document/create-a-coupon-programatically/ yoluyla) bir indirim kuponu oluşturun:

$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'); 
herhangi üzerinde başarısız olursa indirim, başarılı YANLIŞ ise DOĞRU: geçen işlev bir BOOL değeri döndürür

if (!$woocommerce->cart->add_discount(sanitize_text_field($coupon_code))) 
    $woocommerce->show_messages(); 

o:

Sonra sipariş için o kuponu uygulamak çeşitli nedenlerden dolayı.

+0

Arka uçta zaten bir kupon var olduğundan: "999" Yalnızca kuponu uygulamak için sağladığınız kodu ekledim. Ancak, ben woocommerce sepeti sayfasına gittiğimde şu anda hatayı alıyorum: hat 65 üzerinde [yol…] işlev.php içindeki bir nesne olmayan bir add_discount() üye işlevini çağırın [add_discount ile if ifadesi]. Kodun neye benzediğini göstermek için orijinal gönderimdeki kodu güncelledim. – msargenttrue

+1

$ $ $ o adding adding $ total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total total – Freney

+0

Teşekkürler, işe yaradı! Şimdi şimdi indirimi başarılı bir şekilde uygulayabiliyorum ama şimdi başka bir sorun farkettim… Eğer kullanıcı bazı alışveriş sepetlerini kaldırırsa ve sepet 100 lbs veya daha azına geri dönerse indirim hala geçerli. Sepeti koşullara artık uymazsa indirimi kaldırmanın bir yolunu arıyorum, böylece kullanıcılar bu kuponu kullanamaz. Add_discount'ın tersi şekilde çalışan bir remove_discount işlevi olmasını beklerdim ancak Woocommerce API'sinde bir tane bulamadım: http://docs.woothemes.com/wc-apidocs/ – msargenttrue

6

Bu çözümü kullandım, ancak OP'nin yazdığı gibi bir hata içeriyor. Kullanıcı sepeti önizlemeyi atlar ve doğrudan ödeme formuna gider, kuponu uygulamaz. İşte benim çözümümdü.

// 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(); 

      } 

     } 

    } 

}