2017-01-25 16 views
7

Mamy stronę internetową, która sprzedaje części komputerowe. Na tej stronie znajduje się sekcja o nazwie "Złóż komputer", która pozwala użytkownikom wybrać części (płyta główna - procesor - ram, itp.) I zapłacić cenę oraz dostać ich zmontowany produkt, wszystko działa dobrze, ale potrzebuje opcji dodania "opłaty montażowej" do koszyka. Opłatę tę należy dodać tylko wtedy, gdy użytkownik przechodzi przez proces kreatora "Złożenie komputera". Używam tego kodu, ale dodaje go do wszystkich koszyków, to znaczy, że nie jest warunkowy.Opłaty za dodawanie warunkowe do koszyka

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); 
} 

az constructor:

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

Pozwól mi wyjaśnić nieco więcej na temat tego kreatora (Składanie komputera): mamy 3 kroki w tej sekcji

  • krok 1: użytkownik wybiera płytę główną, pamięć RAM, procesor itp. Z istniejących produktów .
  • krok 2: widzi listę i może zmienić ilość niektórych produktów ( jak RAM)
  • krok 3: użytkownik widzi ostatecznej listy z kilkoma opcjami, które mogą
    wyboru w dolnej części strony do montażu opłaty (1. bez montażu, po prostu kupuje listę 2. montaż z roczną gwarancją 3. montaż bez gwarancji) i kiedy trafiają "prześlij", wszystkie wybrane produkty dodaj do koszyka, to jest miejsce, gdzie musimy dodać opłatę, więc tę opłatę należy dodać tylko wtedy, gdy klient skorzysta z tego postępu.

Próbowałem też dodanie opłat, a ja dodać produkty do koszyka, ale to nie działa w ten sposób, kiedy idę do koszyka strony, nie ma dodatkowej opłaty w ten sposób

/* 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 Lepiej jest prowadzić dyskusje na temat pytań SO na miejscu, aby inni użytkownicy mogli skorzystać. –

+0

zapisz informacje dotyczące montażu w sesji, użyj tej wartości, aby określić, czy chcesz dodać opłatę za montaż, czy nie w całej sesji w dowolnym miejscu. –

Odpowiedz

6

ten pracował mnie, na wypadek, gdyby ktoś miał ten sam problem: Ustawiam sesje, kiedy produkty są dodawane do koszyka, a gdy koszyk zostanie opłacony lub opróżniony, anuluję te sesje.

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()); 
} 

Teraz, gdy klient jest przekierowywany na inną stronę (w tym przypadku koszyk strony), możemy określić jego/jej koszyk za dodatkową opłatę na podstawie tej sesji

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'); 

i musimy rozbrojony te sesje, gdy koszyk jest wypłacane lub zostaje opróżnione:

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

ten pracował dla mnie, proszę podzielić się ze mną, jeśli coś jest nie tak o nim.

Powiązane problemy