I am trying to add a coupon code automatically if the cart has products from specific categories. The price must be updated in the Total after showing the discount amount.
But I cant see any changes in the total, kindly help me.
My code:
add_action('wc_cart_product_subtotal' , 'getsubtotalc');
function getsubtotalc ($product_subtotal, $_product, $quantity, $object) {
if( is_cart() || is_checkout() ) {
global $woocommerce, $product;
global $total_qty;
/*$coupon_code = 'drawer';
if ( $woocommerce->cart->has_discount( $coupon_code ) ) return;*/
foreach ( $woocommerce->cart->cart_contents as $product ) {
if( has_term( array('t-shirts-d','socks-d','joggers-d','boxers-d'), 'product_cat', $cart_item['product_id'] ) ){
$coupon_code = 'drawer';
if (!$woocommerce->cart->add_discount( sanitize_text_field( $coupon_code))) {
$woocommerce->show_messages();
}
echo '<div class="woocommerce_message"><strong>The number of Product in your order is greater than 10 so a 10% Discount has been Applied!</strong>
</div>';
}
}
}
}
Thanks
Here is the correct hook and code, that will auto apply a coupon code when a cart item is from specific product categories and will update cart totals:
add_action( 'woocommerce_before_calculate_totals', 'wc_auto_add_coupons_categories_based', 10, 1 );
function wc_auto_add_coupons_categories_based( $cart_object ) {
// HERE define your product categories and your coupon code
$categories = array('t-shirts-d','socks-d','joggers-d','boxers-d');
$coupon = 'drawer';
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Initialising variables
$has_category = false;
// Iterating through each cart item
foreach ( $cart_object->get_cart() as $cart_item ) {
// If a cart item belongs to a product category
if( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ){
$has_category = true; // Set to true
break; // stop the loop
}
}
// If conditions are matched add the coupon discount
if( $has_category && ! $cart_object->has_discount( $coupon )){
// Apply the coupon code
$cart_object->add_discount( $coupon );
// Optionally display a message
wc_add_notice( __('my message goes here'), 'notice');
}
// If conditions are not matched and coupon has been appied
elseif( ! $has_category && $cart_object->has_discount( $coupon )){
// Remove the coupon code
$cart_object->remove_coupon( $coupon );
// Optionally display a message
wc_add_notice( __('my warning message goes here'), 'alert');
}
}
Code goes in function.php file of your active child theme (or theme) or also in any plugin file.
Code is tested on woocommerce 3+ and works.
If the coupon has been applied and the cart items from specific product categories are all removed, the coupon is also removed.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.