Looking to set up a “Buy One Get One” (BOGO) offer in your WooCommerce cart, exclusively for registered users? Want customers to log in to redeem the deal and remove it for non-logged-in visitors? We have the below solution for you.
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; } // Check if the user is logged in if (is_user_logged_in()) { // YOUR SETTINGS: $targeted_product_id = 132; // Set HERE your targeted product ID // 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 customer logs in and adds the product(storage box) to their cart with a quantity of 2, then the second item will receive a 50% discount, as shown below.
In another case, if the customer is not registered, the BOGO offer will not be applied to the cart page as shown below.
Similarly, you can also apply BOGO (Buy One Get One) for customer role in WooCommerce cart page.