In Woocommerce I'm trying to find a way to apply a 10% discount to an entire customer's order if the weight in the cart is over 100 lbs. I'm partway to achieving this. For the next step, I'm looking for a way to programmatically apply a coupon code via action/hook through functions.php.
It appears that I can use the function woocommerce_ajax_apply_coupon to do this ( http://docs.woothemes.com/wc-apidocs/function-woocommerce_ajax_apply_coupon.html ) but I am unsure of how to use it.
So far I've modified cart.php to get the total weight of all the products in the cart, I've created a coupon that applies the discount (if entered manually) and I've added some code to functions.php to check the weight and display a message to the user.
EDIT: Partial code removed, completed code included in the solution below.
Thanks for the guidance Freney. Here's the working end result which successfully applies the discount coupon when the condition is met and also removes it when it's no longer met:
/* 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(); } }
$coupon = new WC_Coupon(); $coupon->set_code( 'blackfrd' ); // Coupon code $coupon->set_amount( 200 ); // Discount amount $coupon->save(); As you could've guessed, two methods set_code() and set_amount() are more than enough to create a coupon. Marketing > Coupons in case you may forget.
The 'Coupon URL' in WooCommerce is automatically generated for you, so you don't need to enter anything here. If you want to use something other than your coupon code itself at the end of the URL, then you can type it in the 'Code URL Override' box.
To create a coupon, simply click WooCommerce > Coupons from within the WordPress dashboard. Go ahead and create your first coupon by selecting Add Coupon. Start by creating the code for your coupon at the top — this is the code customers will apply at the checkout to get their discount.
First, create a discount coupon (via 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' );
Then apply that coupon to your order:
if (!$woocommerce->cart->add_discount( sanitize_text_field( $coupon_code ))) $woocommerce->show_messages();
That last function returns a BOOL value: TRUE if the discount was successful, FALSE if it fails for any one of a variety of reasons.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With