woocommerce offtopic – Unable to add product to the cart

Question

I am using the following code to automatically add a free product to the Woocommerce cart. I took the code from here. But if a user wants to purchase only the product which is set
as the free product, they can’t. If they add that product to the cart and check the cart, the product does not show in the cart.

add_action( 'woocommerce_before_calculate_totals', 'add_free_product_to_cart' );
function add_free_product_to_cart( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $free_product_id = 38; // <= Set the free product id to add
    $min_subtotal    = 80; // <= Set the minimum cart subtotal required

    $has_shippable   = $free_key = false; // Initializing
    $cart_subtotal   = 0;

    // Loop through cart items (first loop)
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ){
        // Check if free product is in cart
        if ( $free_product_id == $cart_item['product_id'] ) {
            $free_key = $cart_item_key;
            $free_qty = $cart_item['quantity'];
            $cart_item['data']->set_price(0); // Optional: Set free product price to zero
        }

        // Check for non virtual products
        if ( $cart_item['data']->is_virtual() !== true ) {
            $has_shippable = true;
        }
        // Calculate items subtotal: Add discounted Line total with taxes
        $cart_subtotal += $cart_item['line_total'] + $cart_item['line_tax'];
    }

    // Add Free product
    if ( $cart_subtotal >= $min_subtotal && $has_shippable && $free_key === false ) {
        $cart->add_to_cart( $free_product_id, 1 );
    }
    // Remove free product
    elseif ( ( $cart_subtotal < $min_subtotal  ) && $free_key !== false ) {
        $cart->remove_cart_item( $free_key );
    }
    // Adjust free product quantity to 1
    elseif ( $free_key !== false && $free_qty > 1 ) {
        $cart->set_quantity( $free_key, 1 );
    }
}

// Optional: Display free product price to zero on minicart
add_filter( 'woocommerce_cart_item_price', 'change_minicart_free_gifted_item_price', 10, 3 );
function change_minicart_free_gifted_item_price( $price_html, $cart_item, $cart_item_key ) {
    $free_product_id   = 38;

    if( $cart_item['product_id'] == $free_product_id ) {
        return wc_price( 0 );
    }
    return $price_html;
}

0
SillyNinja 6 months 2022-02-07T01:37:12-05:00 0 Answers 0 views 0

Leave an answer

Browse
Browse