skip to Main Content

I’m trying to force a specific product in WooCommerce to be sold separately.
I however want this product to sell in unlimited quantity.

Based on Force sold individually product to be bought alone in WooCommerce answer code which works quite well, I am currently using:

function filter_woocommerce_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id = null, $variations = null ) {
    // Product id to bought alone 
    $product_id_alone = 666;
 
    // Set variable
    $alone = true;
 
    // If passed
    if ( $passed ) {
        // If cart is NOT empty when a product is added
        if ( !WC()->cart->is_empty() ) {
 
            // If product id added = product id alone
            if ( $product_id_alone == $product_id ) {
                $alone = false;
            } else {
                // Generate a unique ID for the cart item
                $product_cart_id = WC()->cart->generate_cart_id( $product_id_alone );
 
                // Check if product is in the cart
                $in_cart = WC()->cart->find_product_in_cart( $product_cart_id );
 
                // If product is already in cart
                if ( $in_cart ) {
                    $alone = false;
                }
            }
        } else {
 
            if ( $product_id_alone == $product_id) {
                $alone = true;         
            }
        }
    }
 
    if ( $alone == false ) {
        // Set error message
        $message = 'Product 666 must be bought separately.';
        wc_add_notice( __( $message, 'woocommerce' ), 'error' );
        $passed = false;
    }
 
    return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'filter_woocommerce_add_to_cart_validation', 10, 5 );

If the cart is empty, I can add product with ID 666 with a custom quantity.

Once product ID 666 has been added to the cart, I can’t add another product to the cart.

And if I start by adding another product to an empty cart, I can’t add product ID 666 to the cart.

The issue is that if I add product ID 666 to an empty cart I can’t increase quantity of product 666 by adding more of that product into the cart.

2

Answers


  1. To force a specific product to be sold alone, in a separate order, use:

    function filter_woocommerce_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id = null, $variations = null ) {
        // Product id to bought alone 
        $product_id_alone = 666;
    
        // Set variable
        $flag = false;
    
        // If cart is NOT empty when a product is added
        if ( ! WC()->cart->is_empty() ) {
            // Generate a unique ID for the cart item
            $product_cart_id = WC()->cart->generate_cart_id( $product_id_alone );
    
            // Check if product is in the cart
            $in_cart = WC()->cart->find_product_in_cart( $product_cart_id );
    
            // If product is already in cart & product ID added is not equal to product ID alone
            if ( $in_cart && ( $product_id != $product_id_alone ) ) {
                $flag = true;
            // Product ID alone is NOT in cart & product ID added is equal to product ID alone
            } elseif( ! $in_cart && ( $product_id == $product_id_alone ) ) {
                $flag = true;
            }
        }
    
        // True
        if ( $flag ) {
            // Set error message
            wc_add_notice( sprintf(
                __( 'Product %s must be bought separately', 'woocommerce' ),
                $product_id_alone,
            ), 'error' );
    
            // Passed = false
            $passed = false;
        }
    
        return $passed;
    }
    add_filter( 'woocommerce_add_to_cart_validation', 'filter_woocommerce_add_to_cart_validation', 10, 5 );
    

    When adding the product with ID 666:

    • If the cart is empty, the product can be added with any quantity.
    • If the cart is not empty & the product with ID 666 is NOT in cart, stop.
    • If the cart is not empty & the product with ID 666 is in cart, continue.

    When a product with a different ID is added:

    • If the cart is empty, the product can be added with any quantity.
    • If the cart is not empty & the product with ID 666 is NOT in cart, continue.
    • If the cart is not empty & the product with ID 666 is in cart, stop.
    Login or Signup to reply.
  2. This is my script that prevents products of a certain type from being placed in the same order with those of another, based on the value of a certain tag

    function wc_giftcard_with_own_order( $passed_validation, $product_id ) {
        $cart = WC()->cart->get_cart();
        
        if ( empty($cart) ) {
            // carrello vuoto, per cui passa
            return $passed_validation;
        }
        
        // carrello non vuoto
        // conta quanti prodotti sono di tipo gift card e quanti no
        // tag "gift card" = ID tag 340
        $coupon_si = 0;
        $coupon_no = 0;
        
        foreach ( $cart as $cart_item_key => $cart_item )
            if ( has_term( 340, 'product_tag', $cart_item['product_id'] ) ) {
                $coupon_si += 1;
            }
            else {
                $coupon_no += 1;
            }
            
        // se il prodotto corrente è una gift card, allora può essere aggiunto ad un carrello con soli articole gift card
        // se il prodotto corrente non è una gift card, allora può essere aggiunto ad un carrello con soli articoli non gift card
        if ( has_term( 340, 'product_tag', $product_id ) ) {
            if ( $coupon_no == 0 ) {
                return $passed_validation;
            }
            else {
                wc_add_notice( __( 'La gift card NON può essere acquistata con altri prodotti', 'woocommerce' ), 'error' );
                return false;
            }
        }
        else {
            if ( $coupon_si == 0 ) {
                return $passed_validation;
            }
            else {
                wc_add_notice( __( 'In ordine esiste già almeno una gift card, che NON può essere acquistata con altri prodotti', 'woocommerce' ), 'error' );
                return false;
            }
        }
        
        return $passed_validation;
    }
    add_filter( 'woocommerce_add_to_cart_validation', 'wc_giftcard_with_own_order', 10, 2 );
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search