2016-05-13 4 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 Cart и Remove 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