2017-10-17 23 views
1

J'ai un client actuellement qui vendent la peinture ligne de marquage, et ils veulent une offre sur leur site qui fonctionne de la manière suivante:WooCommerce - Acheter 10, obtenez 3 - seulement le moins cher 3 sont libres

Si un client achète 10+ peintures (ils peuvent mélanger et assortir), ils recevront 3 gratuitement, mais seulement 3 moins cher, sans ...

un exemple est comme ci-dessous:

  • Acheter 10 x (£ 99,99), 1 de y (£ 20,99), et 2 de z (£ 30,99). Le client devrait recevoir le moins cher 3 gratuit, donc, ils devraient recevoir à la fois z et y gratuitement dans ce scénario ...
  • Acheter 14 de x (£ 99.99), 2 de y (£ 20.00) et 2 de z (£ 30.99). Dans ce scénario le client devrait recevoir à la fois de y gratuitement et un de z ...

Je me bats pour accomplir ceci dans WooCommerce, en dépit d'essayer plus longtemps que je voudrais admettre! J'espère que ce qui précède a du sens!

Toute aide ou direction serait grandement appréciée!

EDIT:

Le code que j'ai à ce jour est ci-dessous. Il retourne un tableau des produits les moins chers dans le panier, dans l'ordre, et avec leurs quantités. Le problème est que je dois appliquer la réduction à seulement 3 produits, donc si le premier produit dans le tableau a seulement une quantité de 2, je dois aussi l'appliquer à la deuxième moins chère ... et ainsi de suite ...

function get_cheapest_x_products_in_cart($cat_id) 
{ 

global $woocommerce; 
$cat_products = []; 
$cheapest_products; 


// Add all cart items with correct category to array ($cat_products) 
foreach(WC()->cart->get_cart() as $cart_item) { 
    if(has_term($cat_id, 'product_cat', $cart_item['product_id'])) { 
     $product = wc_get_product($cart_item['product_id']); 
     $price = $product->get_regular_price(); 
     $cat_products[ 
      $cart_item['product_id'] ] = [ 
      'price' => floatval($price), 
      'quantity' => $cart_item['quantity'], 
     ]; 
    } 
} 

    uasort($cat_products, "sort_this"); 

$cheapest_three_products = array_slice($cat_products, 0, 3, true); 
return $cheapest_three_products; 

} 
+0

Qu'avez-vous essayé? De quelle partie de cette modification es-tu * en difficulté *? – ProEvilz

+0

@ProEvilz Désolé, j'aurais dû fournir plus d'informations. La partie avec laquelle je me bats est une fonction qui permet d'obtenir trois produits moins chers, surtout quand les 3 produits les moins chers sont un mélange de plus d'un produit ... si cela a du sens? – Joshua

+0

Une simple boucle 'foreach()' avec une condition 'if' pourrait gérer cela, à en juger par vos commentaires? – ProEvilz

Répondre

1

ci-dessous dans cette fonction personnalisée accroché dans le crochet d'action woocommerce_cart_calculate_fees, le client recevra un rabais basé sur la somme des prix le moins cher 3 articles pour chaque 10 articles dans le panier.

Vous devez définir une catégorie de produits, et le cas échéant, vous obtiendrez un avis personnalisé, lorsque la remise est appliquée ...

Voici le code:

add_action('woocommerce_cart_calculate_fees', 'free_cheapest_3_each_10_items', 10, 1); 
function free_cheapest_3_each_10_items($wc_cart) { 
    if (is_admin() && ! defined('DOING_AJAX')) return; 

    // HERE define your product category (or categories) in the array (IDs slugs or names) 
    $cat_id = array('paints'); 
    $prices = array(); 
    $cat_id = array('clothing'); 
    $discount = $items_count = 0; 

    foreach ($wc_cart->get_cart() as $cart_item){ 
     $sale_price = $cart_item['data']->get_sale_price(); 
     // Only for the defined product category(ies) and no items in sale 
     if(has_term($cat_id, 'product_cat', $cart_item['product_id']) && (empty($sale_price) || $sale_price == 0)) { 
      for($i = 0; $i < $cart_item['quantity']; $i++){ 
       $prices[] = floatval($cart_item['data']->get_regular_price()); 
       $items_count++; 
      } 
     } 
    } 

    if($items_count >= 10){ 
     // Ordering prices 
     asort($prices); 

     // Get the occurence number for 3 free items each 10 items 
     for($i = 0, $j = -1; $i < $items_count; $i++) 
      if($i % 10 == 0) $j++; 

     $count = $j*3; 

     // Get the 3 free items for each 10 items in cart (for the defined product category(ies)) 
     $free_cheapest_items = array_slice($prices, 0, $count, true); 

     // Calculate the discount amount 
     foreach($free_cheapest_items as $item_price) 
      $discount -= $item_price; 

     // The discount 
     if($discount != 0){ 
      $wc_cart->add_fee("Bulk discount", $discount, true); 

      // Displaying a custom notice (optional) 
      wc_clear_notices(); 
      wc_add_notice(__("You get $count free items for the $items_count items in cart"), 'notice'); 
     } 
    } 
} 

du code dans la fonction. fichier php de votre thème enfant actif (ou thème) ou aussi dans n'importe quel fichier plugin.

Testé sur WooCommerce 3 et fonctionne.

+0

Merci beaucoup! J'ai deux questions cependant - dans le '// Obtenir le numéro d'occurrence pour 3 articles gratuits chacun 10 articles', que fait cette partie exactement? Je me bats pour suivre cette partie ... Aussi - je veux seulement qu'elle s'applique une fois, donc pas pour chaque multiple de 10 - comment pourrais-je accomplir cela? – Joshua

+0

@Joshua Il suffit donc de changer '$ count = $ j * 3;' à $ count = 3; '... – LoicTheAztec