2016-08-30 2 views
6

Я работаю в магазине WooCommerce, где мы хотели бы предоставить каждому клиенту бесплатную электронную книгу, которая будет отображаться в корзине после добавления продукт в корзину очевиден.WooCommerce - Auto добавить или удалить автомобиль из корзины

Пример:
Вы добавляете в корзину «product1», и корзина теперь показывает 2 продукта. «продукт1» и «халява». Когда вы удалите продукт из корзины, халява снова будет удалена.

Я получил этот код сейчас:

add_action('woocommerce_add_to_cart', 'check_freebie_exists', 10, 6); 
function check_freebie_exists($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) { 
    if($product_id == 1234) { // obviously replace this with the product that triggers the freebie 
     /* or you could use 
     if(has_term($cat_id, 'product_cat', $product_id)) { to check if a product is in a particular product_cat 
     or you could check anything else related to the product 
     */ 
     $hasfreebie = false; 
     // loop through the cart to check the freebie is not already there 
     global $woocommerce; 
     $cart = $woocommerce->cart->get_cart(); 
     foreach($cart as $key => $values) { 
      if($values['data']->id == $your_freebie_product_id) { 
       $hasfreebie = true; 
       break; 
      } 
     } 
     if(!$hasfreebie) { 
      $woocommerce->cart->add_to_cart($your_freebie_product_id); 
     } 
    } 
} 

add_action('woocommerce_cart_item_removed', 'remove_freebie', 10, 2); 
function remove_freebie($cart_item_key, $cart) { 
    $hasmaster = false; 
    $freebiekey = NULL; 
    foreach($cart as $key => $values) { 
     if($values['data']->id == 1234) { // check that we have the product that should trigger the freebie 
      $hasmaster = true; 
     } elseif($values['data']->id == $your_freebie_product_id) { 
      $freebiekey = $key; 
     } 
    } 
    if(!$hasmaster && $freebiekey) { 
     $cart->remove_cart_item($freebiekey); 
    } 
} 

Но не кажется, что это будет работать еще достаточно.

Что я делаю неправильно?

Любая помощь будет действительно оценена.

Спасибо.

+0

Спасибо, я сделаю это как можно скорее. –

ответ

2

- Обновлено -(проверено и работает для всех продуктов)

Я обновил свой код, чтобы сделать его работу. Этот код проверен и полностью работоспособен:

add_action('woocommerce_add_to_cart', 'check_add_freebie', 10, 6); 

function check_add_freebie($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) { 
    $item_special = $product_id; 
    $freebie_item_id = 99; // the freebie product 

    // just for our special product 
    if($product_id == $item_special) { 
     $cart_items = WC()->cart->get_cart(); 
     // Iterating through each item in cart 
     foreach ($cart_items as $cart_item){ 
      // If freebie product is in cart 
      if($cart_item['data']->id == $freebie_item_id) { 
       $has_freebie = true; 
       break; 
      } 
      // If freebie product is NOT in cart 
      else 
       $has_freebie = false; 
     } 
     // If freebie product is NOT in cart, we add it. 
     if(!$has_freebie) 
      WC()->cart->add_to_cart($freebie_item_id); 
    } 
} 

add_action('woocommerce_cart_item_removed', 'remove_freebie', 10, 2); 

function remove_freebie($cart_item_key, $product_id) { 
    $item_special = $product_id; 
    $freebie_item_id = 99; // the freebie product 
    $hasmaster = false; 
    $freebiekey = NULL; 
    // Iterating through each item in cart 
    foreach(WC()->cart->get_cart() as $item_key => $item) { 
     if ($item['data']->id == $item_special) 
      $hasmaster = true; // Special product is in cart 
     elseif ($item['data']->id == $freebie_item_id) 
      $freebiekey = $item_key; // Freebie product is in cart 
    } 
    // AS freebie product is in cart, it's removed too 
    if(!$hasmaster && !empty($freebiekey)) 
     WC()->cart->remove_cart_item($freebiekey); 
} 

код идет в function.php файле Вашего активного ребенка темы (или темы), или также в любой файл плагина.

Этот код проверен и работает.

+0

Большое спасибо Loic, это работает просто отлично! - Но есть одна небольшая проблема. Возможно, я не объяснял себя так, как предполагалось, но я бы хотел, чтобы халява была добавлена ​​в корзину со всеми моими продуктами. Так что даже если это продукт 1, 6, 27, 1042 или 621, я бы хотел, чтобы халява была добавлена ​​:-) Но если это предназначалось только для определенного продукта, этот код работает просто отлично! У меня только одна категория, так что, может быть, я могу изменить item_speciel с category_speciel? –

+0

Отличный помощник, я буду ждать обновления и повышу, если он будет работать по назначению. –

+0

Огромное спасибо, я не могу описать, насколько я счастлив, что вы заработали :-) Функция уже сейчас работает на моем сайте и работает отлично! Принято и upvote теперь ваше :-) Я надеюсь, что многие другие справки могут использовать его для аналогичных целей. –