7

I'm operating a WooCommerce shop, where we'd like to give every customer a freebie (e-book) that will show in the basket, after you have added a product to the basket obvious.

Example:
You add "product1" to the basket, and the basket will now show 2 products. the "product1" and the "freebie". When you remove the product from the basket, the freebie will be removed again.

I got this code for now:

add_action( 'woocommerce_add_to_cart', 'check_freebie_exists', 10, 6 );
function check_freebie_exists($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
    if($product_id == 1234) { // obviously replace this with the product that triggers the freebie
        /* or you could use
        if(has_term($cat_id, 'product_cat', $product_id)) { to check if a product is in a particular product_cat
        or you could check anything else related to the product
        */
        $hasfreebie = false;
        // loop through the cart to check the freebie is not already there
        global $woocommerce;
        $cart = $woocommerce->cart->get_cart();
        foreach($cart as $key => $values) {
            if($values['data']->id == $your_freebie_product_id) {
                $hasfreebie = true;
                break;
            }
        }
        if(!$hasfreebie) {
            $woocommerce->cart->add_to_cart($your_freebie_product_id);
        }
    }
}

add_action( 'woocommerce_cart_item_removed', 'remove_freebie', 10, 2 );
function remove_freebie( $cart_item_key, $cart ) {
    $hasmaster = false;
    $freebiekey = NULL;
    foreach($cart as $key => $values) {
        if($values['data']->id == 1234) { // check that we have the product that should trigger the freebie
            $hasmaster = true;
        } elseif($values['data']->id == $your_freebie_product_id) {
            $freebiekey = $key;
        }
    }
    if(!$hasmaster && $freebiekey) {
        $cart->remove_cart_item($freebiekey);
    }
}

But it doesn't seem to be working quite yet.

What I am doing wrong?

Any help will be really appreciated.

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
Kasper
  • 105
  • 1
  • 6

1 Answers1

4

Update 2 - October 2018 - Improved and enhanced code (Completely revisited)

The following code will add a freebie product on first add to cart just once. If all other cart items are removed, the freebie item will be removed too:

add_action( 'woocommerce_before_calculate_totals', 'add_remove_freebie', 50, 1 );
function add_remove_freebie( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $freebie_id = 70; // <== HERE set the freebie product ID
    $has_others = false;

    // Loop through cart items
    foreach( $cart->get_cart() as $cart_item_key => $cart_item ) {
        // Added Woocommerce compatibility version
        $product_id = version_compare( WC_VERSION, '3.0', '<' ) ? $cart_item['data']->id : $cart_item['data']->get_id();

        if( $product_id == $freebie_id ) {
            // Freebie is in cart
            $freebie_key = $cart_item_key;
        } else {
            // Other items are in cart
            $has_others = true;
        }
    }
    // If freebie product is alone in cart we remove it
    if( ! $has_others && isset( $freebie_key ) ){
        $cart->remove_cart_item( $freebie_key );
    } elseif ( $has_others && ! isset( $freebie_key ) ) {
        $cart->add_to_cart($freebie_id);
    }
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
  • Thank you very much Loic, this is working just perfect! - But there's one small issue. Maybe i didn't explain myself quite as intended, but i'd like the freebie to be added to the basket, with all my products. So even if it's product 1, 6, 27, 1042, or 621 i would like the freebie to be added :-) But if it was intended to be only a specific product, this code works just perfekt! I only got one category, so maybe i could change the item_speciel with category_speciel? – Kasper Aug 31 '16 at 11:20
  • Great mate, i'll wait for the update, and upvote if it works as intended. – Kasper Aug 31 '16 at 11:26
  • Thank you very much, i can't describe how happy i am, that you made it work :-) The feature is already live on my site now, and working perfectly! Accepted and upvote is now yours :-) I hope many other help can use this for similar purposes. – Kasper Aug 31 '16 at 12:12