2016-05-13 116 views
1

我想爲WooCommerce購物車自動添加獎勵產品的腳本。WooCommerce - 自動添加獎勵產品

獎勵產品將添加到購物車中添加特定產品。但是我從來沒有見過任何改進和完整的功能代碼 - 例如自動刪除獎勵物品或從購物車中刪除主要產品。

在這個解決方案,我想出了下面的代碼,具有以下特點:

  • 選項
  • 多重需要的產品
  • 自動添加
  • 自動刪除(如果沒有購物車裏需要的商品)


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'); 

回答

2

我寫了另一個版本的基礎上,Add To CartRemove From Cart行動,這似乎是更合適的。

$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

謝謝。這很棒! –

+0

@the_ousek如果有效,請接受答案。 – Sark

相關問題