This BOGO promotion is especially useful when you want your customers to explore more categories of products and end up with multiple purchases. The code will offer a free product from category Z if customers add products from both categories of X and Y.
For example, you can consider a bundled category promotion such as customers are required to purchase a smartphone (Category X) and a laptop (Category Y) to qualify for a complimentary accessory, such as a pair of electronic accessories (Category Z).
add_action('woocommerce_add_to_cart', 'ts_add_product_cat', 10, 2); add_action('woocommerce_cart_item_removed', 'ts_check_remove_free_product', 10, 2); function ts_add_product_cat($cart_item_key, $product_id) { $category_ids_to_buy = array(50, 16); // Categories X and Y $free_category_id = 63; // Category Z // Check if the added product belongs to any of the specified categories to buy $product_cats_ids = wc_get_product_term_ids($product_id, 'product_cat'); if (!is_admin() && array_intersect($category_ids_to_buy, $product_cats_ids)) { // Check if both categories X and Y are present in the cart $x_category_present = false; $y_category_present = false; foreach (WC()->cart->get_cart() as $cart_item) { $cart_product_cats_ids = wc_get_product_term_ids($cart_item['product_id'], 'product_cat'); if (in_array(50, $cart_product_cats_ids)) { $x_category_present = true; } if (in_array(16, $cart_product_cats_ids)) { $y_category_present = true; } } // If both categories X and Y are present, add the free product to the cart if ($x_category_present && $y_category_present) { // Get a free product from the specified category $free_product_id = ts_get_free_product_from_category($free_category_id); // If the free product is available, add it to the cart if ($free_product_id) { WC()->cart->add_to_cart($free_product_id); } } } } function ts_check_remove_free_product($removed_cart_item_key, $cart) { $x_category_present = false; $y_category_present = false; foreach ($cart->get_cart() as $cart_item) { $cart_product_cats_ids = wc_get_product_term_ids($cart_item['product_id'], 'product_cat'); if (in_array(50, $cart_product_cats_ids)) { $x_category_present = true; } if (in_array(16, $cart_product_cats_ids)) { $y_category_present = true; } } // If either category X or category Y is not present, remove the free product if (!$x_category_present || !$y_category_present) { // Find and remove the free product from the cart foreach ($cart->get_cart() as $cart_item_key => $values) { $_product = $values['data']; $free_product_id = ts_get_free_product_from_category(63); // Free product category ID if ($free_product_id && $_product->get_id() == $free_product_id) { $cart->remove_cart_item($cart_item_key); break; // Stop after removing the first occurrence } } } } function ts_get_free_product_from_category($category_id) { // Implement this function to dynamically get a free product ID from the specified category $args = array( 'post_type' => 'product', 'posts_per_page' => 1, 'tax_query' => array( array( 'taxonomy' => 'product_cat', 'field' => 'id', 'terms' => $category_id, ), ), ); $products_query = new WP_Query($args); if ($products_query->have_posts()) { $products_query->the_post(); $free_product_id = get_the_ID(); wp_reset_postdata(); return $free_product_id; } return null; // Return null if no free product is found }
Output
When the customer adds products to the cart, the code loops through the cart items and checks if the items belong to both category X and Y. Only when both categories are present, the code will automatically include the complimentary product from Category Z in the cart.
If either a product from category X or Y is not present, or if such products added to cart from category X or Y are removed, the complimentary free product added to the cart is also removed. This ensures that the free product is offered when the cart contains items from both the categories of X & Y.
In similar to the above customization, you can offer free gifts based on different conditions. Check out this guide that will help you to automatically add a product to your WooCommerce cart based on cart total, categories, website visit, etc.