2016-05-13 98 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