2013-04-01 26 views
27

In Woocommerce versuche ich einen Weg zu finden, einen 10% Rabatt auf die Bestellung eines ganzen Kunden anzuwenden, wenn das Gewicht im Einkaufswagen über 100 Pfund ist. Ich bin ein Teil davon, dies zu erreichen. Für den nächsten Schritt suche ich nach einer Möglichkeit, einen Gutscheincode über action/hook über functions.php programmatisch anzuwenden.Wie programmiere ich einen Gutschein in Woocommerce?

Es scheint, dass ich die Funktion woocommerce_ajax_apply_coupon verwenden kann, um dies zu tun (http://docs.woothemes.com/wc-apidocs/function-woocommerce_ajax_apply_coupon.html), aber ich bin mir nicht sicher, wie man es benutzt.

Bis jetzt habe ich cart.php geändert, um das Gesamtgewicht aller Produkte im Warenkorb zu erhalten, ich habe einen Gutschein erstellt, der den Rabatt (wenn manuell eingegeben) anwendet, und ich habe Code zu Funktionen hinzugefügt .php, um das Gewicht zu überprüfen und dem Benutzer eine Nachricht anzuzeigen.

EDIT: Teilcode entfernt, abgeschlossen Code in Lösung unten enthalten.


Dank für die Führung Freney. Hier ist das Arbeitsende Ergebnis, das erfolgreich den Rabatt-Coupon gilt, wenn die Bedingung erfüllt ist und entfernt es auch, wenn es nicht mehr erfüllt ist:

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

Antwort

27

zunächst einen Rabatt-Coupon (via http://docs.woothemes.com/document/create-a-coupon-programatically/) erstellen:

$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'); 

dann, dass Coupon an Ihre Bestellung gelten:

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

diese letzte Funktion einen BOOL-Wert zurückgibt: TRUE, wenn der Rabatt erfolgreich war, FALSCH, wenn es für jede fehlschlägt e aus einer Vielzahl von Gründen.

+0

Da ich bereits einen Coupon im Backend habe: "999" habe ich nur den Code hinzugefügt, den Sie zum Anwenden des Coupons angegeben haben. Wenn ich jedoch zur Woocommerce-Cart-Seite gehe, bekomme ich jetzt den Fehler: Aufruf einer Member-Funktion add_discount() für ein Nicht-Objekt in [Pfad zu ...] functions.php in Zeile 65 [die if-Anweisung mit add_discount]. Ich habe den Code in meinem ursprünglichen Beitrag aktualisiert, um Ihnen zu zeigen, wie es aussieht. – msargenttrue

+1

Versuchen Sie, 'global $ woocommerce;' zusammen mit Ihrer '$ total_weight' Zeile hinzuzufügen. – Freney

+0

Danke, das hat funktioniert! So jetzt bin ich in der Lage, den Rabatt erfolgreich anzuwenden, aber jetzt bemerke ich ein anderes Problem ... Wenn der Benutzer einige Warenkorb-Artikel entfernt und der Einkaufswagen wieder auf 100 Pfund oder weniger geht, dann ist der Rabatt immer noch da. Ich suche nach einer Möglichkeit, den Rabatt zu entfernen, wenn der Einkaufswagen die Bedingung nicht mehr erfüllt, so dass Benutzer diesen Gutschein nicht nutzen können. Ich würde erwarten, dass es eine remove_discount Funktion gibt, die den umgekehrten Weg von add_discount darstellt, aber ich konnte keinen in der Woocommerce API-Dokumentation finden: http://docs.woothemes.com/wc-apidocs/ – msargenttrue

6

Ich habe diese Lösung verwendet, aber es enthält einen Fehler, wie das OP es geschrieben hat. Wenn der Benutzer die Vorschau des Einkaufswagens überspringt und direkt zur Kasse geht, wird der Gutschein nicht verwendet. Hier war meine Lösung.

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

      } 

     } 

    } 

}