Force specific WooCommerce product to be sold in separate order

Solution:

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.