2017-01-25 2 views
7

У нас есть сайт, который продает компьютерные части. На этом сайте есть раздел «Соберите свой компьютер», который позволяет пользователям выбирать детали (материнская плата - CPU-ram и т. Д.) И оплачивать цену и получить собранный продукт, все работает отлично, но ему нужно добавить «сбор за сбор» в корзину. Этот сбор должен быть добавлен только в том случае, если пользователь выполнит процедуру «Собрать свой компьютер». Я использую этот код, но он добавляет его ко всем тележкам, я имею в виду, что это не условно.Условные взносы в корзину

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

и на constructor:

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

Позвольте мне объяснить немного больше об этом мастере (Сборка компьютера): Мы имеем 3 шага в этом разделе,

  • шаг 1: пользователь выбирает Main board, Ram, Cpu и т. Д. Из существующих продуктов.
  • шаг 2: видит список и может изменить количество некоторых продуктов ( как Ram)
  • шага 3: пользователь видит окончательный список с некоторыми опциями, которые могут
    выбрать в нижней части страницы для сборки платы (1. нет сборки, просто покупает список 2. сборка с гарантией на один год 3. сборка без гарантии), и когда они нажмут «отправить», все выбранные товары добавляются в корзину, здесь мы должны добавить, что так что этот сбор должен быть добавлен только в том случае, если клиент использует этот прогресс.

Я также попытался добавить сборы в то время как я добавить товар в корзину, но он не работает так, когда я иду на странице корзины, нет никакой дополнительной платы таким образом

/* 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 на месте, чтобы другие пользователи могли воспользоваться. –

+0

сохраните информацию об ассемблере в сеансе, используйте это значение, чтобы определить, хотите ли вы добавить сборку сборов или нет на всей сессии в любом месте. –

ответ

6

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

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

Теперь, когда клиент перенаправляется на другую страницу (в данном случае, страница корзины), мы можем определить дополнительную плату его/ее ТЕЛЕГУ, основываясь на этой сессии

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

и мы должны незадана эти сессии, когда тележка оплаченные или получает опустели:

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

Это работает для меня, пожалуйста, поделитесь со мной, если что-то не так об этом.

Смежные вопросы