2017-01-25 28 views
7

Şartlar ilavelerini siteye ekle Bilgisayar parçaları satan bir websitemiz var, Bu sitenin bir bölümünde "PC'nizi bir araya getirin" bölümünde kullanıcıların parçalarını seçmelerine (anakart - işlemci - ram, vb.) Izin veriyor ve fiyatını ödüyoruz. monte edilen ürünü al, her şey gayet iyi çalışıyor, ancak sepete bir "montaj ücreti" ekleme seçeneğine ihtiyacı var. Bu ücret, sadece "PC'nizi bir araya getirin" sihirbaz sürecine girerse eklenir. Bu kodu kullanıyorum ama tüm arabalara ekler, yani şartlı değil. Koşullar:

public function calculate_fees($fees){ 
    global $woocommerce; 

    $cart_subtotal = $woocommerce->cart->subtotal; 
    $additional_fee = 0; // Additional fee 
    $additional_fee_text = __('Assembling fee : ', 'dornaweb'); 

    if($_POST['assembly_fee'] === 'flat_assembly_rate'){ 
     $additional_fee = intval(dw_option('flat_assembly_rate')) ?: 0; // flat assembly fee 
     $additional_fee_text .= __(' (assembly, no warranty)', 'dornaweb'); 
    } elseif($_POST['assembly_fee'] === 'percentage_assembly_fee') { 
     $additional_fee = dw_option('percentage_assembly_fee') ? ((intval(dw_option('percentage_assembly_fee'))/100) * $cart_subtotal) : 0; // percentage assembly fee 
     $additional_fee_text .= __(' (assembly + one year warranty)', 'dornaweb'); 
    } 

    $woocommerce->cart->add_fee($additional_fee_text, intval($additional_fee), 1); 
} 

ve üzerinde

constructor:

add_action('woocommerce_cart_calculate_fees', array($this, 'calculate_fees')); 

beni (PC monte) Bu sihirbaz hakkında biraz daha açıklayalım: Bu bölümdeki 3 adımlar var ,

  • adım 1: kullanıcı mevcut ürünlerinden Ana kart, Ram, Cpu vb. Seçer.
  • adım 2: listesini görür ve bazı ürünlerin miktarını (Ram gibi )
  • 3. adımı değiştirebilir: Kullanıcı ücretini montaj için
    sayfanın dibinde seçebileceğiniz bazı seçenekleri ile nihai liste (görür 1. hiçbir montaj, sadece bir yıl garanti ile satın alma 2. bir garanti ile montaj 3) hiçbir garanti ile montaj ve onlar "gönder" vurduğunuzda, seçilen tüm ürünler sepete eklenir, bu biz eklemek gerekir Ücret, bu ücret sadece müşteri bu ilerlemeyi kullanıyorsa eklenmelidir. i sepeti sayfasına gittiğinizde sepetine ürün eklerken

Ayrıca ücretleri ekleyerek çalıştı ama bu şekilde çalışmıyor, hiçbir ek ücret Bu çalıştı bu şekilde

/* User chooses list of products (mainboard, ram, ...) and can choose quantity of each product 
and also can choose whether he/she wants to get an assembled computer 
or just wants to buy the products individually, 
then when he/she hits submit products get added to cart all together 
in this step assembling fee should be added and calculated in cart total */ 
if(!empty($_POST['action']) && $_POST['action'] == 'add'){ 
     /** 
     * Add each product to cart based on user choice 
     */ 
     foreach($_POST['products'] as $product_id => $data) { 
      WC()->cart->add_to_cart($product_id, $data['qty']); 
     } 

     /** 
     * Add additional fees 
     */ 
     WC()->cart->add_fee('Assembling fee', 10); // 10 is an example , the fee differs depending on user choice (no assemble:0, assemlby+warranty:5% of the cart subtotal, assembly+no warranty: a flat fee eg. 20$) 
     WC()->cart->calculate_fees(); 

     /** 
     * Redirect to cart 
     */ 
     wp_safe_redirect(WC()->cart->get_cart_url()); 
} 
+0

@LoicTheAztec SO soruları hakkındaki tartışmaları yerinde tutmak, böylece diğer kullanıcıların faydalanabilmesi daha iyidir. –

+0

Montaj ile ilgili bilgileri oturumda saklayın, herhangi bir yerde tüm oturumda montaj ücreti eklemek isteyip istemediğinizi belirlemek için bu değeri kullanın. –

cevap

6

orada var Bazıları aynı sorunla karşılaşırsa: Ürünler sepete eklendiğinde ve arabayı ödediğinde veya boşaldığında bazı oturumları ayarlıyorum, bu oturumları kaldırıyorum.

if(!empty($_POST['action']) && $_POST['action'] == 'add'){ 
    /** 
    * Add each product to cart based on user choice 
    */ 
    foreach($_POST['products'] as $product_id => $data) { 
     WC()->cart->add_to_cart($product_id, $data['qty']); 
    } 

    /** 
    * We set sessions after products added to cart 
    */ 
    WC()->session->set('MY_SESSION', 'My_value'); 

    /** 
    * Redirect to cart 
    */ 
    wp_safe_redirect(WC()->cart->get_cart_url()); 
} 

müşteri (bu durumda, sepeti sayfası olarak) başka bir sayfaya yönlendirilir Şimdi zaman, biz bu oturumda

function dw_calculate_fees($cart_object){ 
    global $woocommerce; 
    if (is_admin() && ! defined('DOING_AJAX')) return; 
    if(! WC()->session->MY_SESSION) return; 

    $cart_subtotal = $woocommerce->cart->subtotal; 
    $additional_fee = null; 

    if(WC()->session->MY_SESSION === 'example_a'){ 
     $additional_fee = 1; 
    } elseif(WC()->session->MY_SESSION === 'example_b') { 
     $additional_fee = 2; 
    } else{ 
     $additional_fee = 0; 
    } 

    if(! is_null($additional_fee)) { 
     $woocommerce->cart->add_fee('Additional fee ', intval($additional_fee), 1); 
    } 
} 
add_action('woocommerce_cart_calculate_fees', 'dw_calculate_fees'); 

dayalı onun/onu sepetinizin ek ücret belirleyebilir ve biz unset gerekir sepeti ödenir veya boşaltılmış olur bu seans: bir şey bu konuda yanlışsa

add_action('woocommerce_cart_emptied', 'dw_unset_fee_session'); 
function dw_unset_fee_session(){ 
    unset(WC()->session->MY_SESSION); 
} 

Bu benim için çalıştı, benimle paylaş.