Добавляйте налоговые сборы в корзину 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' );

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

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


person Tasos    schedule 11.08.2016    source источник
comment
Извините за задержку. Я также связался со службой поддержки woo commerce, и они сказали мне, что мой исходный код был правильным и существует возможный конфликт с темой или другим плагином. Я исследую это в понедельник.   -  person Tasos    schedule 14.08.2016


Ответы (1)


(Обновление): НАЛОГОВЫЕ ВАРИАНТЫ с метод add_fee ()

ВАЖНО: тот факт, что TAX работает или нет с add_fee() метод зависит от ваших налоговых настроек в woocommerce. Поскольку вы не сообщили в своем вопросе каковы ваши настройки НАЛОГОВ, вам невозможно помочь (настройки налогов могут быть гораздо более разными для каждой электронной коммерции. веб-сайт).

Например, если вы хотите использовать класс налога с нулевой ставкой, но не определили правильный класс налога с нулевой ставкой для страны клиента, это не сработает, если вы попытаетесь его использовать. с:
WC()->cart->add_fee( 'Fees: ', $fee, true, 'zero rate' ); в зависимости от ваших глобальных налоговых настроек.

Вот снимок экрана с РЕАЛЬНОЙ суммой кассовых сборов для 3 товаров в корзине (с использованием кода ниже):

введите описание изображения здесь

Метод add_fee () класса WC_Cart добавляет дополнительную плату в корзину.

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 - < strong> add_fee( $name, $amount, $taxable = false, $tax_class = '' ) метод

person LoicTheAztec    schedule 11.08.2016
comment
Всем привет. Спасибо за подробный ответ, но я считаю, что произошло недоразумение. $bookable_total - это просто переменная, которую я использую в цикле, и она меняется, если есть определенные типы продуктов. На размер комиссии это не влияет. Но, чтобы было ясно. Мой код добавляет комиссию, но включает налог. Я хочу, чтобы плата не облагалась налогом. Какой из 4 кодов не делает. - person Tasos; 12.08.2016
comment
@Tasos Хорошо, я обновил свой ответ. Ваша проблема определенно связана с вашим веб-сайтом woocommerce Налоговые настройки ... - person LoicTheAztec; 12.08.2016
comment
@Tasos Precision: На моем реальном примере скриншота я использую (как французский клиент) 20% от обычной налоговой ставки. Итак, как видите, налог не применяется к комиссии. - person LoicTheAztec; 12.08.2016