Я искал способ добавить депозит на общую сумму корзины на сайте Woocommerce (а не просто добавить депозит для каждой товарной позиции).
Я нашел ответ на эту гениальную тему здесь: Депозит на основе процента от общей суммы корзины
Вот код, который я использовал в итоге:
add_action( 'woocommerce_cart_calculate_fees', 'booking_deposit_calculation' );
function booking_deposit_calculation( $cart_object ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
## Set HERE your negative percentage (to remove an amount from cart total)
$percent = -.50; // 50% off (negative)
// Get cart subtotal excluding taxes
$cart_subtotal = $cart_object->subtotal_ex_tax;
// or for subtotal including taxes use instead:
// $cart_subtotal = $cart_object->subtotal;
## ## CALCULATION ## ##
$calculated_amount = $cart_subtotal * $percent;
// Adding a negative fee to cart amount (excluding taxes)
$cart_object->add_fee( __('Deposit calculation', 'woocommerce'), $calculated_amount, false );
}
По умолчанию для каждого продукта на странице корзины и оформления заказа создается депозит в размере 50%. Brilliant! (Используя CSS, я смог стилизовать описания в интерфейсе.)
Однако у меня есть несколько продуктов (одна категория продуктов), для которых я не хочу форсировать этот депозит.
Итак, вот мой вопрос:
Как я могу настроить код, чтобы продолжать вводить депозит по умолчанию, но исключить депозит из одной категории продуктов (или продуктов из этой категории, если я не могу исключить целую категорию)?
В подключенной функции ниже вам нужно будет установить массив идентификаторов продуктов или (а также) категории товаров, чтобы исключить их. Если вы не используете один из них, вы можете установить пустой массив, как, например, $product_categories = array();
…
Вот код:
add_action( 'woocommerce_cart_calculate_fees', 'custom_deposit_calculation', 10, 1 );
function custom_deposit_calculation( $cart_object ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Define the product IDs to exclude
$product_ids = array( 37, 25, 50 );
// Define the product categories to exclude (can be IDs, slugs or names)
$product_categories = array( 'clothing' );
$amount_to_exclude_with_tax = 0;
// Iterating through cart items
foreach ( $cart_object->get_cart() as $cart_item ){
// If condition match we get the sum of the line item total (excl. tax)
if( in_array( $cart_item['product_id'], $product_ids ) || has_term( $product_categories, 'product_cat', $cart_item['product_id'] ) )
$amount_to_exclude_with_tax += $cart_item['line_total'];
// OR replace by (for tax inclusion)
// $amount_to_exclude_with_tax += $cart_item['line_tax'] + $cart_item['line_total'];
}
## Set HERE your negative percentage (to remove an amount from cart total)
$percent = -0.5; // 50% off (negative)
// Get cart subtotal excluding taxes
$cart_subtotal = $cart_object->subtotal_ex_tax - $amount_to_exclude_with_tax;
// or for subtotal including taxes use instead:
// $cart_subtotal = $cart_object->subtotal;
## ## CALCULATION ## ##
$calculated_amount = $cart_subtotal * $percent;
if( $calculated_amount != 0){
// Adding a negative fee to cart amount (Including taxes)
$cart_object->add_fee( __('Deposit calculation', 'woocommerce'), $calculated_amount, true );
}
}
Код помещается в файл function.php вашей активной дочерней темы (или темы) или также в любой файл плагина.
Проверено на WooCommerce 3 и работает.
Других решений пока нет …