У нас есть сайт, который продает компьютерные части. На этом сайте есть раздел «Соберите свой компьютер», который позволяет пользователям выбирать детали (материнская плата - 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());
}
@LoicTheAztec Лучше вести обсуждения вопросов SO на месте, чтобы другие пользователи могли воспользоваться. –
сохраните информацию об ассемблере в сеансе, используйте это значение, чтобы определить, хотите ли вы добавить сборку сборов или нет на всей сессии в любом месте. –