简体   繁体   中英

Apply/determine discount based on a particular product category only when a specific product is in WooCommerce cart

I would like to replicate promo for a specific item.

If you buy one (b10 plus) product then you're eligible for a total 289€ discount on all light shaping tools, so if you add to cart accessories for a "category subtotal" of 100€ you get 100€ discount, if you take 300€ accessories you get 289€ discount.

I tried with another solution (plugins and php code) but it keeps discounting each item (that correspond to "accessories") for $289.

I also tried to include automatically a discount for that category if the "B10 plus" is in the cart. but this code add the discount to single products

This is my current code:

add_action( 'woocommerce_before_cart', 'bbloomer_apply_matched_coupons' );
  
function bbloomer_apply_matched_coupons() {
  
    $coupon_code = 'promob10'; 
  
    if ( WC()->cart->has_discount( $coupon_code ) ) return;
  
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
  
    // this is your product ID
    $autocoupon = array( 373 );
  
    if ( in_array( $cart_item['product_id'], $autocoupon ) ) {   
        WC()->cart->apply_coupon( $coupon_code );
        wc_print_notices();
    }
  
    }
  
}

To apply a discount based on a specific product ID you can use the woocommerce_cart_calculate_fees hook

  1. First of all you will have to determine the specific product ID, this corresponds to the b10 product from your question
  2. Then it will be checked whether this specific product is in the cart via find_product_in_cart() . If that's the case, let's move on
  3. Through the price of the specific product ID, we determine the maximum discount
  4. The price of the products belonging to the particular category is added to total discount (assuming that the b10 product does not belong to this category)
  5. If the total discount is less than the maximum discount, we will use this discount. If not, the maximum discount will be applied

So you get:

function action_woocommerce_cart_calculate_fees( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Product ID of the specific product
    $specific_product_id = 817;
    
    // The term name/term_id/slug to check for.
    $category = 'accessories';
    
    // Initialize
    $total_discount = 0;
    $maximum_discount = 0;

    // Cart id
    $product_cart_id = $cart->generate_cart_id( $specific_product_id );

    // Find product in cart
    $in_cart = $cart->find_product_in_cart( $product_cart_id );
    
    // In cart
    if ( $in_cart ) {       
        // Gets cart contents
        foreach ( $cart->get_cart_contents() as $cart_item ) {
            // Get product id
            $product_id = $cart_item['product_id'];
            
            // Compare
            if ( $product_id == $specific_product_id ) {
                // Get price = maximum discount
                $maximum_discount = $cart_item['data']->get_price();
            }

            // Has certain category     
            if ( has_term( $category, 'product_cat', $product_id ) ) {
                // Get price
                $price = $cart_item['data']->get_price();
                
                // Get quantity
                $quantity = $cart_item['quantity'];
                
                // Addition to the total discount
                $total_discount += $price * $quantity;
            }
        }

        // Less than
        if ( $total_discount < $maximum_discount ) {
            // Add total discount
            $cart->add_fee( __( 'Discount applied', 'woocommerce' ), -$total_discount, false );
        } else {
            // Add maximum discount         
            $cart->add_fee( __( 'Discount applied', 'woocommerce' ), -$maximum_discount, false );
        }
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'action_woocommerce_cart_calculate_fees', 10, 1 );

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