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

    関連する問題