Я пытаюсь добавить сборы, основываясь на некоторых вычислениях, которые я делаю для корзины Woocommerce, но я хочу исключить ее из НДС. Это мой код:
function woo_add_cart_fee( $cart ) {
global $woocommerce; $bookable_total = 0;
foreach(WC()->cart->get_cart() as $cart_item_key => $values) {
$_product = $values['data'];
//doing my stuff to calculate $fee variable
WC()->cart->add_fee( 'Fees: ', $fee, false, '' );
//WC()->cart->add_fee( 'Fees: ', $fee, true, '' );
//WC()->cart->add_fee( 'Fees: ', $fee, false, 'zero rate' );
//WC()->cart->add_fee( 'Fees: ', $fee, true, 'zero rate' );
}
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
Я перепробовал все закомментированные версии, и каждая из них также включает НДС на сборы.
Есть идеи, как мне этого добиться?
(Обновить): НАЛОГОВЫЕ ВАРИАНТЫ с метод add_fee ()
ВАЖНЫЙ: Тот факт, что НАЛОГ работает или нет с
add_fee()
метод зависит первый из ваших налоговых настроек в торговле Как у вас не говори в вашем вопросе каковы ваши настройки налогов, Вам не возможно помочь (Налоговые настройки могут быть намного более разными для каждого сайта электронной коммерции).
Например, если вы хотите использовать налоговый класс с нулевой ставкой, но вы не определили правильный класс налога с нулевой ставкой для страны клиента, это не будет работать, если вы попытаетесь использовать его с:
WC()->cart->add_fee( 'Fees: ', $fee, true, 'zero rate' );
… в зависимости от ваших глобальных налоговых настроек.
Вот скриншот РЕАЛЬНЫХ итогов проверки для 3 товаров в корзине (используя код ниже):
Класс WC_Cart add_fee (), добавляет дополнительную плату в корзину.
add_fee( string $name, float $amount, boolean $taxable = false, string $tax_class = '' )
Parameters: $name Unique name for the fee. Multiple fees of the same name cannot be added. $amount Fee amount. $taxable (default: false) Is the fee taxable? $tax_class (default: '') The tax class for the fee if taxable. A blank string is standard tax class.
Оригинальный ответ (обновленный код):
Ваша главная проблема в эта строка:
global $woocommerce, $bookable_total = 0;
- Как вы используете
WC()->cart
синтаксис вместо$woocommerce->cart
синтаксис, тебе не нужноglobal $woocommerce;
.- Если вы используете
global $bookable_total = 0;
этот$bookable_total
будет всегда= 0
.
Вместо этого вы будете использоватьglobal $bookable_total;
без значения чтобы получить значение, определенное вне вашей функции.
Но если вы хотите установить значение на ноль, в случае, если это не определено вне вашей функции, вы сделаете это следующим образом:woo_add_cart_fee( $bookable_total=0 )
Мы можем определить сейчас $bookable_total
значение переменной снаружи функция.
Это рабочий пример с вашим кодом:
// This variable value is passed to our function
$bookable_total = 1;
function woo_add_cart_fee( $bookable_total = 0 ) {
global $bookable_total;
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// just for this example
$item_count = 0;
$item_fee = 5;
// going through each cart items
foreach( WC()->cart->get_cart() as $values ) {
$item = $values['data'];
if ( empty( $item ) )
break;
// getting the cart item_id
$item_id = $item->id;
$item_count++;
// your calculations
}
// We test $bookable_total value, defined to '1' outside our function
// and to 'O' if not defined outside (in this case the fee will be '0')
$fee = $item_count * $bookable_total * $item_fee;
// add_fee method (TAX will NOT be applied here)
WC()->cart->add_fee( 'Fees: ', $fee, false );
}
add_action( 'woocommerce_cart_calculate_fees','woo_add_cart_fee' );
Этот код проверен и работает. Он идет по файлу function.php вашей активной дочерней темы или темы.
Если $bookable_total
переменная не определена снаружи, значение будет 0
.
Замечания: Лучше получить идентификаторы $ items с:
$item = $values['data']; $item_id = $item->id;
Ссылка:
Класс WC_Cart — add_fee( $name, $amount, $taxable = false, $tax_class = '' )
метод
Других решений пока нет …