2016-05-13 5 views
1

Ich möchte ein Skript erstellen, um automatisch ein Bonusprodukt zum WooCommerce-Einkaufswagen hinzuzufügen.WooCommerce - Bonus-Produkt automatisch hinzufügen

Das Bonusprodukt würde in den Warenkorb hinzugefügt, wenn ein bestimmtes Produkt hinzugefügt wird. Aber ich habe noch nie einen verbesserten und voll funktionierenden Code mit Funktionen gesehen - wie das automatische Entfernen des Bonuselements oder das Entfernen des/der Primärprodukte aus dem Einkaufswagen.

In dieser Lösung habe ich mit dem Code unten kommen, die folgende Merkmale aufweist:

  • Optionen
  • Mehrere erforderlichen Produkte
  • Automatisches Hinzufügen
  • Automatische entfernen (wenn es keine ist gewünschtes Produkt im Warenkorb)


function bonus_product() { 
    if (is_admin()) return; 

    //## OPTIONS 
    $options = (object) array(
     'bonus_product_id'  => 1891, //bonus product to add 
     'required_products_id' => array(1873), //at least on of the specific product(s) needs to be represented in the cart 
    ); 

    //function variables 
    $cart_items = WC()->cart->get_cart(); 
    $bonus_product_found = false; 
    $required_product_found = false; 

    //check if the cart is not empty 
    if(sizeof($cart_items) > 0) { 
    //checking for required products. loop through the cart items 
    foreach ($cart_items as $key => $item) { 
     //bonus product already in the cart? 
     if($item['product_id'] == $options->bonus_product_id) { 
     $bonus_product_found = true; 
     } 
     //one of required products in the cart? 
     if(in_array($item['product_id'], $options->required_products_id)) { 
     $required_product_found = true; 
     } 
    } 

    //adding/removing bonus product 
    //add bonus product to the cart 
    if(!$bonus_product_found && $required_product_found) { 
     WC()->cart->add_to_cart($options->bonus_product_id); 
    } 
    //remove bonus product from the cart if none of required items is in the cart 
    if($bonus_product_found && !$required_product_found) { 
     $cart = WC()->instance()->cart; 
     $cart_id = $cart->generate_cart_id($options->bonus_product_id); 
     $cart_item_id = $cart->find_product_in_cart($cart_id); 
     $cart->set_quantity($cart_item_id, 0); 
    }  
    } 
} 

add_action('init', 'bonus_product'); 

Antwort

2

Ich habe eine alternative Version geschrieben, basierend auf Add To Cart und Remove From Cart Aktion, die besser geeignet zu sein scheint.

$bonus_options = (object) array(
    'bonus_product_id'  => 1891, 
    'required_products_id' => array(1873) 
); 

// this function called whenever there is a product added to cart 
function add_bonus_product($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) { 
    global $bonus_options; 
    // is the product is eligible for bonus product? 
    if(in_array($product_id, $bonus_options->required_products_id)) { 
     // add the bonus product to cart 
     WC()->cart->add_to_cart($bonus_options->bonus_product_id, 1, 0, array(), array("parent_product_line_item" => $cart_item_key)); 
     // later if user removes the product from cart we can use the "parent_product_line_item" to remove the bonus product as well 
    } 
} 
add_action('woocommerce_add_to_cart', 'add_bonus_product', 10, 6); 

// this function will be called whenever there is a product removed from cart 
function remove_bonus_product($cart_item_key, $cart) { 
    $cart_items = WC()->cart->get_cart(); 
    foreach ($cart_items as $key => $item) { 
     if($item["parent_product_line_item"] == $cart_item_key) { 
      // ok this cart item is a bonus item to the product that being removed from the cart 
      // So remove this too 
      WC()->cart->remove_cart_item($key); 
     } 
    } 
} 

add_action('woocommerce_cart_item_removed', 'remove_bonus_product', 10, 2); 
+0

Vielen Dank. Es ist toll! –

+0

@the_ousek Wenn es funktioniert, bitte akzeptieren Sie die Antwort. – Sark