Добавляйте налоги в корзину WooCommerce программно

Я пытаюсь добавить сборы, основываясь на некоторых вычислениях, которые я делаю для корзины 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' );

Я перепробовал все закомментированные версии, и каждая из них также включает НДС на сборы.

Есть идеи, как мне этого добиться?

4

Решение

(Обновить): НАЛОГОВЫЕ ВАРИАНТЫ с метод 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;

  1. Как вы используете WC()->cart синтаксис вместо $woocommerce->cart синтаксис, тебе не нужно global $woocommerce;.
  2. Если вы используете 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 = '' ) метод

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]