简体   繁体   中英

Add WooCommerce coupon code automatically based on product categories

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM