If you wish to offer a BOGO (Buy One Get One) deal based on the user’s role in WooCommerce, use the following code snippet. This code snippet implements a custom discount rule in your WooCommerce store, providing a 50% discount on the second item for specific products purchased by customers with certain roles.
add_action('woocommerce_cart_calculate_fees', 'ts_custom_discount_2nd_at_50', 10, 1 ); function ts_custom_discount_2nd_at_50( $cart ){ if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // YOUR SETTINGS: $targeted_product_id = 34; // Set HERE your targeted product ID $allowed_customer_roles = array('customer'); // Specify the allowed customer roles // Check if the current user has the allowed customer role if ( ! is_user_logged_in() || ! array_intersect($allowed_customer_roles, wp_get_current_user()->roles) ) return; // Initializing variables $discount = $qty_notice = 0; $items_prices = array(); // Loop through cart items foreach ( $cart->get_cart() as $key => $cart_item ) { if( in_array( $targeted_product_id, [$cart_item['product_id'], $cart_item['variation_id']] ) ){ $quantity = (int) $cart_item['quantity']; $qty_notice += $quantity; for( $i = 0; $i < $quantity; $i++ ) { $items_prices[] = floatval( $cart_item['data']->get_price()); } } } $count_items = count($items_prices); // Count items rsort($items_prices); // Sorting prices descending order if( $count_items > 1 ) { foreach( $items_prices as $key => $price ) { if( $key % 2 == 1 ) $discount -= number_format( $price / 2, 2 ); } } // Applying the discount if( $discount != 0 ){ $cart->add_fee('Buy one get one 50% off', $discount ); // Displaying a custom notice (optional) wc_clear_notices(); // clear other notices on checkout page. if( ! is_checkout() ){ wc_add_notice( __("You get 50% of discount on the 2nd item"), 'notice'); } } // Display a custom notice on cart page when quantity is equal to 1. elseif( $qty_notice == 1 ){ wc_clear_notices(); // clear other notices on checkout page. if( is_cart() ){ wc_add_notice( __( "Add one more to get 50% off on 2nd item" ), 'notice'); } } }
Output
When the user logs in as a ‘customer’ role, and adds the product i.e. T-shirt with Logo on to the cart page with the quantity of 2, the BOGO offer gets applied as shown below.
Similarly, you can also create BOGO (Buy One Get One) offers based on ProductIDs in WooCommerce cart page.